From 42f7a6beef7f1e15976a54be9e099c38d87cdab8 Mon Sep 17 00:00:00 2001 From: yoanslvy <97676023+yoanslvy@users.noreply.github.com> Date: Mon, 22 Jan 2024 14:24:38 +0100 Subject: [PATCH] update: deploy muster mainnet (#25) --- deployments/avalanche/Webauthn.json | 100 ------- deployments/avalanche/WrapperFCLWebAuthn.json | 103 ------- .../avalanche_production/Webauthn.json | 100 ------- .../WrapperFCLWebAuthn.json | 103 ------- deployments/chiado/Webauthn.json | 100 ------- deployments/chiado/WrapperFCLWebAuthn.json | 103 ------- deployments/chiado_production/Webauthn.json | 100 ------- .../chiado_production/WrapperFCLWebAuthn.json | 87 ------ deployments/fuji/Webauthn.json | 100 ------- deployments/fuji/WrapperFCLWebAuthn.json | 103 ------- deployments/fuji_production/Webauthn.json | 100 ------- .../fuji_production/WrapperFCLWebAuthn.json | 103 ------- deployments/gnosischain/Webauthn.json | 100 ------- .../gnosischain/WrapperFCLWebAuthn.json | 87 ------ .../gnosischain_production/Webauthn.json | 84 ------ .../WrapperFCLWebAuthn.json | 103 ------- deployments/mumbai/Webauthn.json | 84 ------ deployments/mumbai/WrapperFCLWebAuthn.json | 87 ------ deployments/mumbai_production/Webauthn.json | 84 ------ .../mumbai_production/WrapperFCLWebAuthn.json | 119 -------- deployments/mumbai_staging/Webauthn.json | 116 -------- .../mumbai_staging/WrapperFCLWebAuthn.json | 119 -------- deployments/muster/.chainId | 1 + deployments/muster/P256Signer.json | 275 ++++++++++++++++++ deployments/muster/P256SignerFactory.json | 137 +++++++++ .../c99418166b2fc7a84fdc0f742530dbd8.json | 57 ++++ deployments/muster_production/.chainId | 1 + deployments/muster_production/P256Signer.json | 275 ++++++++++++++++++ .../muster_production/P256SignerFactory.json | 137 +++++++++ .../c99418166b2fc7a84fdc0f742530dbd8.json | 57 ++++ deployments/muster_staging/.chainId | 1 + deployments/muster_staging/P256Signer.json | 275 ++++++++++++++++++ .../muster_staging/P256SignerFactory.json | 137 +++++++++ .../c99418166b2fc7a84fdc0f742530dbd8.json | 57 ++++ deployments/muster_testnet/Webauthn.json | 100 ------- .../muster_testnet/WrapperFCLWebAuthn.json | 103 ------- .../muster_testnet_production/Webauthn.json | 100 ------- .../WrapperFCLWebAuthn.json | 103 ------- .../muster_testnet_staging/Webauthn.json | 100 ------- .../WrapperFCLWebAuthn.json | 103 ------- deployments/polygon_production/Webauthn.json | 84 ------ .../WrapperFCLWebAuthn.json | 119 -------- deployments/polygon_staging/Webauthn.json | 116 -------- .../polygon_staging/WrapperFCLWebAuthn.json | 119 -------- .../redstone_holesky_production/Webauthn.json | 100 ------- .../WrapperFCLWebAuthn.json | 103 ------- hardhat.config.js | 19 ++ package.json | 2 +- yarn.lock | 8 +- 49 files changed, 1434 insertions(+), 3440 deletions(-) delete mode 100644 deployments/avalanche/Webauthn.json delete mode 100644 deployments/avalanche/WrapperFCLWebAuthn.json delete mode 100644 deployments/avalanche_production/Webauthn.json delete mode 100644 deployments/avalanche_production/WrapperFCLWebAuthn.json delete mode 100644 deployments/chiado/Webauthn.json delete mode 100644 deployments/chiado/WrapperFCLWebAuthn.json delete mode 100644 deployments/chiado_production/Webauthn.json delete mode 100644 deployments/chiado_production/WrapperFCLWebAuthn.json delete mode 100644 deployments/fuji/Webauthn.json delete mode 100644 deployments/fuji/WrapperFCLWebAuthn.json delete mode 100644 deployments/fuji_production/Webauthn.json delete mode 100644 deployments/fuji_production/WrapperFCLWebAuthn.json delete mode 100644 deployments/gnosischain/Webauthn.json delete mode 100644 deployments/gnosischain/WrapperFCLWebAuthn.json delete mode 100644 deployments/gnosischain_production/Webauthn.json delete mode 100644 deployments/gnosischain_production/WrapperFCLWebAuthn.json delete mode 100644 deployments/mumbai/Webauthn.json delete mode 100644 deployments/mumbai/WrapperFCLWebAuthn.json delete mode 100644 deployments/mumbai_production/Webauthn.json delete mode 100644 deployments/mumbai_production/WrapperFCLWebAuthn.json delete mode 100644 deployments/mumbai_staging/Webauthn.json delete mode 100644 deployments/mumbai_staging/WrapperFCLWebAuthn.json create mode 100644 deployments/muster/.chainId create mode 100644 deployments/muster/P256Signer.json create mode 100644 deployments/muster/P256SignerFactory.json create mode 100644 deployments/muster/solcInputs/c99418166b2fc7a84fdc0f742530dbd8.json create mode 100644 deployments/muster_production/.chainId create mode 100644 deployments/muster_production/P256Signer.json create mode 100644 deployments/muster_production/P256SignerFactory.json create mode 100644 deployments/muster_production/solcInputs/c99418166b2fc7a84fdc0f742530dbd8.json create mode 100644 deployments/muster_staging/.chainId create mode 100644 deployments/muster_staging/P256Signer.json create mode 100644 deployments/muster_staging/P256SignerFactory.json create mode 100644 deployments/muster_staging/solcInputs/c99418166b2fc7a84fdc0f742530dbd8.json delete mode 100644 deployments/muster_testnet/Webauthn.json delete mode 100644 deployments/muster_testnet/WrapperFCLWebAuthn.json delete mode 100644 deployments/muster_testnet_production/Webauthn.json delete mode 100644 deployments/muster_testnet_production/WrapperFCLWebAuthn.json delete mode 100644 deployments/muster_testnet_staging/Webauthn.json delete mode 100644 deployments/muster_testnet_staging/WrapperFCLWebAuthn.json delete mode 100644 deployments/polygon_production/Webauthn.json delete mode 100644 deployments/polygon_production/WrapperFCLWebAuthn.json delete mode 100644 deployments/polygon_staging/Webauthn.json delete mode 100644 deployments/polygon_staging/WrapperFCLWebAuthn.json delete mode 100644 deployments/redstone_holesky_production/Webauthn.json delete mode 100644 deployments/redstone_holesky_production/WrapperFCLWebAuthn.json diff --git a/deployments/avalanche/Webauthn.json b/deployments/avalanche/Webauthn.json deleted file mode 100644 index 1f4d93d..0000000 --- a/deployments/avalanche/Webauthn.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "address": "0x04641D72fbE21Db00c1d2f04d19E8206fB8D1eD3", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x2a9b2bb5e68b14dcb5ea603279308ba0df4a068d02339b67b433e2c70542aced", - "receipt": { - "to": "0x6A78a27E52fa669C0a5246574Ece2e9a64c483B1", - "from": "0xbcE1ECDf21a8B27ddDd23d0F07827925299b9C39", - "contractAddress": null, - "transactionIndex": 2, - "gasUsed": "1594097", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xcc2d5c06cc078cbbd2f34585daca43ce626d9530c93c7667980ae206c2bb77f9", - "transactionHash": "0x2a9b2bb5e68b14dcb5ea603279308ba0df4a068d02339b67b433e2c70542aced", - "logs": [], - "blockNumber": 35681593, - "cumulativeGasUsed": "1810081", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/avalanche/WrapperFCLWebAuthn.json b/deployments/avalanche/WrapperFCLWebAuthn.json deleted file mode 100644 index d367dea..0000000 --- a/deployments/avalanche/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "address": "0xB15bb4dE71bF6fbB91913872dB9F18E6C8897E9F", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x3613492cf06bdfd7a3bdd5ce920f51b753c1416b4d2f22b35750e120a6577711", - "receipt": { - "to": "0x6A78a27E52fa669C0a5246574Ece2e9a64c483B1", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 79, - "gasUsed": "1488101", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x9696011752cdd17ac05643c99dbd33dd224167079d9cf9874b5ccbe62dbbde74", - "transactionHash": "0x3613492cf06bdfd7a3bdd5ce920f51b753c1416b4d2f22b35750e120a6577711", - "logs": [], - "blockNumber": 39203612, - "cumulativeGasUsed": "3626362", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/avalanche_production/Webauthn.json b/deployments/avalanche_production/Webauthn.json deleted file mode 100644 index 646bb8a..0000000 --- a/deployments/avalanche_production/Webauthn.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "address": "0xAB57C7CC84fCb57Ac919b672714FABcc1b78CF39", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x24955759971e8f06f2049af31abce38f2bbdb168b95f23820d3a155fe7571491", - "receipt": { - "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", - "from": "0xbcE1ECDf21a8B27ddDd23d0F07827925299b9C39", - "contractAddress": null, - "transactionIndex": 5, - "gasUsed": "1594097", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x03d987ec1fce21b7d920f22524e037de3c92047d91c1fe738a10daf4ea43439e", - "transactionHash": "0x24955759971e8f06f2049af31abce38f2bbdb168b95f23820d3a155fe7571491", - "logs": [], - "blockNumber": 35681640, - "cumulativeGasUsed": "2470154", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/avalanche_production/WrapperFCLWebAuthn.json b/deployments/avalanche_production/WrapperFCLWebAuthn.json deleted file mode 100644 index c5b5bac..0000000 --- a/deployments/avalanche_production/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "address": "0x21D84679F9dd3f0e4914a806113CF329368d5253", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xe746177870461ac85b3f3a802c4fd6a6a054f7c3486cf91341e253f7d2b75b74", - "receipt": { - "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", - "from": "0x53011E110CAd8685F4911508B4E2413f526Df73E", - "contractAddress": null, - "transactionIndex": 47, - "gasUsed": "1488101", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xe790d74e6a1854a7a54717dec313e2f45ce810fe0a2b57c833137e08bf2742a1", - "transactionHash": "0xe746177870461ac85b3f3a802c4fd6a6a054f7c3486cf91341e253f7d2b75b74", - "logs": [], - "blockNumber": 39252997, - "cumulativeGasUsed": "2522141", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/chiado/Webauthn.json b/deployments/chiado/Webauthn.json deleted file mode 100644 index b08570b..0000000 --- a/deployments/chiado/Webauthn.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "address": "0x04641D72fbE21Db00c1d2f04d19E8206fB8D1eD3", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x2e1bea4ca9303a6cc8c3d54c51d125774a20b7fb7c8938b23133c981292c1d7b", - "receipt": { - "to": "0x6A78a27E52fa669C0a5246574Ece2e9a64c483B1", - "from": "0xbcE1ECDf21a8B27ddDd23d0F07827925299b9C39", - "contractAddress": null, - "transactionIndex": 0, - "gasUsed": "1594553", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x76b4ce137ce56bee646bcfca0a8bf6a0048ac5c4f79d2ea072030bc2a52f1b95", - "transactionHash": "0x2e1bea4ca9303a6cc8c3d54c51d125774a20b7fb7c8938b23133c981292c1d7b", - "logs": [], - "blockNumber": 6241878, - "cumulativeGasUsed": "1594553", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/chiado/WrapperFCLWebAuthn.json b/deployments/chiado/WrapperFCLWebAuthn.json deleted file mode 100644 index 98da4ac..0000000 --- a/deployments/chiado/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "address": "0xB15bb4dE71bF6fbB91913872dB9F18E6C8897E9F", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xd5a6ffa7cd22bb2f925aea610f3cb3bd5290d3eee185f17588349a9ff2f0d0b7", - "receipt": { - "to": "0x6A78a27E52fa669C0a5246574Ece2e9a64c483B1", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 5, - "gasUsed": "1488525", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xdc6da04e52d145eecb2683720fb364f2e4288f68350a28c0420bf88143fe7fab", - "transactionHash": "0xd5a6ffa7cd22bb2f925aea610f3cb3bd5290d3eee185f17588349a9ff2f0d0b7", - "logs": [], - "blockNumber": 7411485, - "cumulativeGasUsed": "2929541", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/chiado_production/Webauthn.json b/deployments/chiado_production/Webauthn.json deleted file mode 100644 index 53e1f86..0000000 --- a/deployments/chiado_production/Webauthn.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "address": "0xAB57C7CC84fCb57Ac919b672714FABcc1b78CF39", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x13d5b02db99712ec44976f301faf3ab5aecf714937ca7e653ddbf6a4fa0e062a", - "receipt": { - "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", - "from": "0xbcE1ECDf21a8B27ddDd23d0F07827925299b9C39", - "contractAddress": null, - "transactionIndex": 0, - "gasUsed": "1594553", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x3f5ee62211d21dfbfd2c2264463a6e1449b9edf54257ae883f0249ce1d2c06ac", - "transactionHash": "0x13d5b02db99712ec44976f301faf3ab5aecf714937ca7e653ddbf6a4fa0e062a", - "logs": [], - "blockNumber": 6241963, - "cumulativeGasUsed": "1594553", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/chiado_production/WrapperFCLWebAuthn.json b/deployments/chiado_production/WrapperFCLWebAuthn.json deleted file mode 100644 index 9fe9f92..0000000 --- a/deployments/chiado_production/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "address": "0x21D84679F9dd3f0e4914a806113CF329368d5253", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/fuji/Webauthn.json b/deployments/fuji/Webauthn.json deleted file mode 100644 index c3c4a49..0000000 --- a/deployments/fuji/Webauthn.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "address": "0x04641D72fbE21Db00c1d2f04d19E8206fB8D1eD3", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xf3fa7f8ea29fc90b9ec17266ca00c20a5cbc3a23e3056e28090ce991c66e74f1", - "receipt": { - "to": "0x6A78a27E52fa669C0a5246574Ece2e9a64c483B1", - "from": "0xbcE1ECDf21a8B27ddDd23d0F07827925299b9C39", - "contractAddress": null, - "transactionIndex": 5, - "gasUsed": "1594097", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xbfe125e09be0650f252725e335c6c7aafc0e0e562b6d7e0fff92020758ea9603", - "transactionHash": "0xf3fa7f8ea29fc90b9ec17266ca00c20a5cbc3a23e3056e28090ce991c66e74f1", - "logs": [], - "blockNumber": 26220632, - "cumulativeGasUsed": "2175485", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/fuji/WrapperFCLWebAuthn.json b/deployments/fuji/WrapperFCLWebAuthn.json deleted file mode 100644 index b304764..0000000 --- a/deployments/fuji/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "address": "0xB15bb4dE71bF6fbB91913872dB9F18E6C8897E9F", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xf7d6dee89e7cd8218bcdd6457be6050a650fd483574d2171dbb17c770bb55619", - "receipt": { - "to": "0x6A78a27E52fa669C0a5246574Ece2e9a64c483B1", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 0, - "gasUsed": "1488101", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x887a3b5e1aec8f33cb3d95fa9a04ad6e38a93fc440dfcd7cc897fcb4b4267c7b", - "transactionHash": "0xf7d6dee89e7cd8218bcdd6457be6050a650fd483574d2171dbb17c770bb55619", - "logs": [], - "blockNumber": 28654651, - "cumulativeGasUsed": "1488101", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/fuji_production/Webauthn.json b/deployments/fuji_production/Webauthn.json deleted file mode 100644 index 4abb777..0000000 --- a/deployments/fuji_production/Webauthn.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "address": "0xAB57C7CC84fCb57Ac919b672714FABcc1b78CF39", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x89c91ce73de62013ef4b13e4dd5800a430d951ccca98fb2efe5170fd08a353ab", - "receipt": { - "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", - "from": "0xbcE1ECDf21a8B27ddDd23d0F07827925299b9C39", - "contractAddress": null, - "transactionIndex": 2, - "gasUsed": "1594097", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x2e8e3c26f42336a3b32662aaf2f03ab820e5025589bcba404708c1586d38be33", - "transactionHash": "0x89c91ce73de62013ef4b13e4dd5800a430d951ccca98fb2efe5170fd08a353ab", - "logs": [], - "blockNumber": 26220581, - "cumulativeGasUsed": "1799775", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/fuji_production/WrapperFCLWebAuthn.json b/deployments/fuji_production/WrapperFCLWebAuthn.json deleted file mode 100644 index 23c523c..0000000 --- a/deployments/fuji_production/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "address": "0x21D84679F9dd3f0e4914a806113CF329368d5253", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x10c4b734bf90111d522dbd4c15805d87ab32b6442063e82e4575a7e5a8ac5a68", - "receipt": { - "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "1488101", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x13626c771c30d0c38cebd8e8c62e4ef81f3fb3f4fd110730ac3048f84cbe3935", - "transactionHash": "0x10c4b734bf90111d522dbd4c15805d87ab32b6442063e82e4575a7e5a8ac5a68", - "logs": [], - "blockNumber": 28682451, - "cumulativeGasUsed": "1526203", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/gnosischain/Webauthn.json b/deployments/gnosischain/Webauthn.json deleted file mode 100644 index ad43293..0000000 --- a/deployments/gnosischain/Webauthn.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "address": "0x04641D72fbE21Db00c1d2f04d19E8206fB8D1eD3", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xb95e7faef0c1f6bc44314c62be6b3fa39e10aa75c4da539768acc28fe5125edd", - "receipt": { - "to": "0x6A78a27E52fa669C0a5246574Ece2e9a64c483B1", - "from": "0x7F1c3D46E52A2Fcef4B28BCfeEB11030A4544EFd", - "contractAddress": null, - "transactionIndex": 5, - "gasUsed": "1594553", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xdad12df8f5ad848eab5670554c4d8b2e7ef0e138a4849d1dd3b8342300cd9a52", - "transactionHash": "0xb95e7faef0c1f6bc44314c62be6b3fa39e10aa75c4da539768acc28fe5125edd", - "logs": [], - "blockNumber": 30160850, - "cumulativeGasUsed": "2261818", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 2, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/gnosischain/WrapperFCLWebAuthn.json b/deployments/gnosischain/WrapperFCLWebAuthn.json deleted file mode 100644 index e7e242f..0000000 --- a/deployments/gnosischain/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "address": "0xB15bb4dE71bF6fbB91913872dB9F18E6C8897E9F", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/gnosischain_production/Webauthn.json b/deployments/gnosischain_production/Webauthn.json deleted file mode 100644 index 6cb1c0f..0000000 --- a/deployments/gnosischain_production/Webauthn.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "address": "0xAB57C7CC84fCb57Ac919b672714FABcc1b78CF39", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/gnosischain_production/WrapperFCLWebAuthn.json b/deployments/gnosischain_production/WrapperFCLWebAuthn.json deleted file mode 100644 index e53babb..0000000 --- a/deployments/gnosischain_production/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "address": "0x21D84679F9dd3f0e4914a806113CF329368d5253", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x7dadc8cc39f21bde2187b10777340ac4f06216cbe88f0f0a40aed188294433ca", - "receipt": { - "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 6, - "gasUsed": "1488525", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xe2ae8dbd5dbf1af9f19c8d84a6544f8b611d7a9594d8a3a89e5e2a25b14a2955", - "transactionHash": "0x7dadc8cc39f21bde2187b10777340ac4f06216cbe88f0f0a40aed188294433ca", - "logs": [], - "blockNumber": 31519770, - "cumulativeGasUsed": "16946856", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/mumbai/Webauthn.json b/deployments/mumbai/Webauthn.json deleted file mode 100644 index b784f0d..0000000 --- a/deployments/mumbai/Webauthn.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "address": "0x04641D72fbE21Db00c1d2f04d19E8206fB8D1eD3", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "args": [], - "numDeployments": 3, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/mumbai/WrapperFCLWebAuthn.json b/deployments/mumbai/WrapperFCLWebAuthn.json deleted file mode 100644 index e7e242f..0000000 --- a/deployments/mumbai/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "address": "0xB15bb4dE71bF6fbB91913872dB9F18E6C8897E9F", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/mumbai_production/Webauthn.json b/deployments/mumbai_production/Webauthn.json deleted file mode 100644 index 6cb1c0f..0000000 --- a/deployments/mumbai_production/Webauthn.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "address": "0xAB57C7CC84fCb57Ac919b672714FABcc1b78CF39", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/mumbai_production/WrapperFCLWebAuthn.json b/deployments/mumbai_production/WrapperFCLWebAuthn.json deleted file mode 100644 index cf674ec..0000000 --- a/deployments/mumbai_production/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "address": "0x21D84679F9dd3f0e4914a806113CF329368d5253", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x6d8d6d7b37d90a41cf310a958546241315b8dd65974b407bdc313eaad566eb41", - "receipt": { - "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 8, - "gasUsed": "1488525", - "logsBloom": "0x00000000000001000000000000000000000000000000000000000000000000000000000000010000000000000000000000008000002000000000000000000000000000000000000000000000000000800000000000000000040100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000040000000004000000000000008000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", - "blockHash": "0xa3f3021d56af1e2b6ba2273e4367933336a961a5a2fe3f83092f919265445148", - "transactionHash": "0x6d8d6d7b37d90a41cf310a958546241315b8dd65974b407bdc313eaad566eb41", - "logs": [ - { - "transactionIndex": 8, - "blockNumber": 43756421, - "transactionHash": "0x6d8d6d7b37d90a41cf310a958546241315b8dd65974b407bdc313eaad566eb41", - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x00000000000000000000000065245f19c92ac5adce53244406ad126398ef203a", - "0x000000000000000000000000c275dc8be39f50d12f66b6a63629c39da5bae5bd" - ], - "data": "0x0000000000000000000000000000000000000000000000000007eeb559cbe30000000000000000000000000000000000000000000000000000b185e8c6a4fb500000000000000000000000000000000000000000000013b631242feec9a67a3300000000000000000000000000000000000000000000000000a997336cd918500000000000000000000000000000000000000000000013b6312c1ea423725d33", - "logIndex": 19, - "blockHash": "0xa3f3021d56af1e2b6ba2273e4367933336a961a5a2fe3f83092f919265445148" - } - ], - "blockNumber": 43756421, - "cumulativeGasUsed": "1989149", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/mumbai_staging/Webauthn.json b/deployments/mumbai_staging/Webauthn.json deleted file mode 100644 index 5f5246f..0000000 --- a/deployments/mumbai_staging/Webauthn.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "address": "0xf6e6a4f353f7b8117f9313dFBA05568b8E836140", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xcc790d4fe077fe46e376a60131e9615dcfb0147b72e17fe1706eb3951f01000a", - "receipt": { - "to": "0x1C702034b2533639f25601024565b087f8cD9391", - "from": "0xbcE1ECDf21a8B27ddDd23d0F07827925299b9C39", - "contractAddress": null, - "transactionIndex": 6, - "gasUsed": "1594097", - "logsBloom": "0x00000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000100000000000000000000000000000000000000000000000000800000000000000000020100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000001000000000000000004000000000000000000001000000000000000100000000000000100000000000000000000000000000000000000000000000000000000000000000040000100000", - "blockHash": "0xd46104418dfebd110995111caa0ccc86ae107b9e477471e07f485291986e926a", - "transactionHash": "0xcc790d4fe077fe46e376a60131e9615dcfb0147b72e17fe1706eb3951f01000a", - "logs": [ - { - "transactionIndex": 6, - "blockNumber": 41347937, - "transactionHash": "0xcc790d4fe077fe46e376a60131e9615dcfb0147b72e17fe1706eb3951f01000a", - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x000000000000000000000000bce1ecdf21a8b27dddd23d0f07827925299b9c39", - "0x000000000000000000000000cfef2a3dc244ef7d0fb93c45e762d671445c4569" - ], - "data": "0x000000000000000000000000000000000000000000000000000a6204adbb04c200000000000000000000000000000000000000000000000001c462c9a3b501b900000000000000000000000000000000000000000000006dc51a5204f5f6e52800000000000000000000000000000000000000000000000001ba00c4f5f9fcf700000000000000000000000000000000000000000000006dc524b409a3b1e9ea", - "logIndex": 26, - "blockHash": "0xd46104418dfebd110995111caa0ccc86ae107b9e477471e07f485291986e926a" - } - ], - "blockNumber": 41347937, - "cumulativeGasUsed": "4909666", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/mumbai_staging/WrapperFCLWebAuthn.json b/deployments/mumbai_staging/WrapperFCLWebAuthn.json deleted file mode 100644 index 360f236..0000000 --- a/deployments/mumbai_staging/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "address": "0xa8a027c9433A56b35e1efcC8F396C7cf8243f3c3", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x07670dc4b10254ef5e8e1cf9736076ae01387207fd3bf7811cae9bb9496b38a6", - "receipt": { - "to": "0x1C702034b2533639f25601024565b087f8cD9391", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 8, - "gasUsed": "1488525", - "logsBloom": "0x00000000000001000000000000000000000000000000000000000000000000100000000000010000000000000000000000008000000000000200000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000400000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000008000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", - "blockHash": "0x30e6316e4632e757e52facc5d90d24a57fe84f5be39fbf549e2710089642fc21", - "transactionHash": "0x07670dc4b10254ef5e8e1cf9736076ae01387207fd3bf7811cae9bb9496b38a6", - "logs": [ - { - "transactionIndex": 8, - "blockNumber": 43757824, - "transactionHash": "0x07670dc4b10254ef5e8e1cf9736076ae01387207fd3bf7811cae9bb9496b38a6", - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x00000000000000000000000065245f19c92ac5adce53244406ad126398ef203a", - "0x000000000000000000000000244c9aa5d417e0dc869ee5ab9b7430402368e2b2" - ], - "data": "0x000000000000000000000000000000000000000000000000000c0123812cc79600000000000000000000000000000000000000000000000000a535a2fa4c38b00000000000000000000000000000000000000000000000110519f2969988e8150000000000000000000000000000000000000000000000000099347f791f711a0000000000000000000000000000000000000000000000110525f3ba1ab5afab", - "logIndex": 33, - "blockHash": "0x30e6316e4632e757e52facc5d90d24a57fe84f5be39fbf549e2710089642fc21" - } - ], - "blockNumber": 43757824, - "cumulativeGasUsed": "2522326", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/muster/.chainId b/deployments/muster/.chainId new file mode 100644 index 0000000..9592e7f --- /dev/null +++ b/deployments/muster/.chainId @@ -0,0 +1 @@ +4078 \ No newline at end of file diff --git a/deployments/muster/P256Signer.json b/deployments/muster/P256Signer.json new file mode 100644 index 0000000..2429715 --- /dev/null +++ b/deployments/muster/P256Signer.json @@ -0,0 +1,275 @@ +{ + "address": "0x52E7e05A9F333c17A5b86e92799e9b7aD13d3503", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AlreadyInitialized", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidAuthenticatorData", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidClientData", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidHash", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_hash", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "x", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "y", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xc94336f7bfbab6916c4ccd1309752942284d1bbcb17f2b05d13ea504a6a72991", + "receipt": { + "to": "0x6A78a27E52fa669C0a5246574Ece2e9a64c483B1", + "from": "0xda677C8877E49Dfc31dC7e92fA7615F4Fb4047D7", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "1932374", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x353142e8021ea31ee6b08ffffe0bb32ec142505fb7748dca9b741d7ebc9f9d1e", + "transactionHash": "0xc94336f7bfbab6916c4ccd1309752942284d1bbcb17f2b05d13ea504a6a72991", + "logs": [], + "blockNumber": 108, + "cumulativeGasUsed": "1932374", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "c99418166b2fc7a84fdc0f742530dbd8", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y_\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_hash\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"x\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"y\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is the implementation. It is meant to be used through proxy clone.\",\"kind\":\"dev\",\"methods\":{\"initialize(uint256,uint256)\":{\"details\":\"This function is only callable once and needs to be called immediately after deployment by the factory in the same transaction.\",\"params\":{\"x_\":\"The x coordinate of the public key\",\"y_\":\"The y coordinate of the public key\"}},\"isValidSignature(bytes,bytes)\":{\"details\":\"This is the old version of the function of EIP-1271 using bytes memory instead of bytes32\",\"params\":{\"_hash\":\"The hash of the data signed\",\"_signature\":\"The signature\"},\"returns\":{\"_0\":\"The EIP-1271 magic value\"}},\"isValidSignature(bytes32,bytes)\":{\"params\":{\"_hash\":\"The hash of the data signed\",\"_signature\":\"The signature\"},\"returns\":{\"_0\":\"The EIP-1271 magic value\"}}},\"title\":\"P256Signer\",\"version\":1},\"userdoc\":{\"errors\":{\"AlreadyInitialized()\":[{\"notice\":\"Error message when the contract is already initialized\"}],\"InvalidHash()\":[{\"notice\":\"Error message when the hash is invalid\"}],\"InvalidSignature()\":[{\"notice\":\"Error message when the signature is invalid\"}]},\"kind\":\"user\",\"methods\":{\"initialized()\":{\"notice\":\"Whether the contract has been initialized\"},\"isValidSignature(bytes,bytes)\":{\"notice\":\"Verifies that the signer is the owner of the secp256r1 public key.\"},\"isValidSignature(bytes32,bytes)\":{\"notice\":\"Verifies that the signer is the owner of the secp256r1 public key.\"},\"x()\":{\"notice\":\"The x coordinate of the secp256r1 public key\"},\"y()\":{\"notice\":\"The y coordinate of the secp256r1 public key\"}},\"notice\":\"A contract used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/P256Signer.sol\":\"P256Signer\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\nimport {FCL_ecdsa} from \\\"./FCL_ecdsa.sol\\\";\\n\\nimport {FCL_ecdsa_utils} from \\\"./FCL_ecdsa_utils.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n return checkSignature(authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs, Q[0], Q[1]);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 Qx,\\n uint256 Qy\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_ecdsa_utils.ecdsa_verify(message, rs, Qx, Qy);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_ecdsa.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xc2811ef6e17ea1d5509a3d3f7d5af5e56583347b36093d05530425d7c1316dd6\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_ecdsa.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_ecdsa.sol\\n///*\\n///*\\n///* DESCRIPTION: ecdsa verification implementation\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\n\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\n\\n\\nlibrary FCL_ecdsa {\\n // Set parameters for curve sec256r1.public\\n //curve order (number of points)\\n uint256 constant n = FCL_Elliptic_ZZ.n;\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key, no calldata version\\n */\\n function ecdsa_verify(bytes32 message, uint256 r, uint256 s, uint256 Qx, uint256 Qy) internal view returns (bool){\\n\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return false;\\n }\\n \\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\\n uint256 x1;\\n\\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\\n\\n x1= addmod(x1, n-r,n );\\n \\n return x1 == 0;\\n }\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\\n {\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return address(0);\\n }\\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256 r, uint256 s, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n \\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n X= addmod(X, n-r,n );\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n X= addmod(X, n-r,n );\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n}\\n\",\"keccak256\":\"0x679d2e9a655cd7e156a0cfc24de0aca88d4e0b34a8e0dfe6a599f23af092f5a2\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_ecdsa_utils.sol\":{\"content\":\"\\n//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_ecdsa.sol\\n///*\\n///*\\n///* DESCRIPTION: ecdsa verification implementation\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\n\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\n\\n\\nlibrary FCL_ecdsa_utils {\\n // Set parameters for curve sec256r1.public\\n //curve order (number of points)\\n uint256 constant n = FCL_Elliptic_ZZ.n;\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256 Qx, uint256 Qy) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return false;\\n }\\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\\n uint256 x1;\\n\\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\\n x1= addmod(x1, n-r,n );\\n \\n \\n return x1 == 0;\\n }\\n\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n return ecdsa_verify(message, rs, Q[0], Q[1]);\\n }\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\\n {\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return address(0);\\n }\\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) internal view returns(uint256 r, uint256 s)\\n {\\n r=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, FCL_Elliptic_ZZ.n); \\n s=mulmod(FCL_Elliptic_ZZ.FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n //ecdsa key derivation\\n //kpriv is private key return (x,y) coordinates of associated Pubkey\\n function ecdsa_derivKpub(uint256 kpriv) internal view returns(uint256 x, uint256 y)\\n {\\n \\n x=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, kpriv, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n y=FCL_Elliptic_ZZ.ec_Decompress(x, 1);\\n \\n if (FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(x, y, kpriv, FCL_Elliptic_ZZ.n - 1) != 0) //extract correct y value\\n {\\n y=FCL_Elliptic_ZZ.p-y;\\n } \\n\\n }\\n \\n //precomputations for 8 dimensional trick\\n function Precalc_8dim( uint256 Qx, uint256 Qy) internal view returns( uint[2][256] memory Prec)\\n {\\n \\n uint[2][8] memory Pow64_PQ; //store P, 64P, 128P, 192P, Q, 64Q, 128Q, 192Q\\n \\n //the trivial private keys 1 and -1 are forbidden\\n if(Qx==FCL_Elliptic_ZZ.gx)\\n {\\n revert();\\n }\\n Pow64_PQ[0][0]=FCL_Elliptic_ZZ.gx;\\n Pow64_PQ[0][1]=FCL_Elliptic_ZZ.gy;\\n \\n Pow64_PQ[4][0]=Qx;\\n Pow64_PQ[4][1]=Qy;\\n \\n /* raise to multiplication by 64 by 6 consecutive doubling*/\\n for(uint j=1;j<4;j++){\\n uint256 x;\\n uint256 y;\\n uint256 zz;\\n uint256 zzz;\\n \\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j-1][0], Pow64_PQ[j-1][1], 1, 1);\\n \\t(Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n (x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+3][0], Pow64_PQ[j+3][1], 1, 1);\\n \\t(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n\\n \\tfor(uint i=0;i<63;i++){\\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j][0], Pow64_PQ[j][1],1,1);\\n (Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1],1,1);\\n (Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n \\t}\\n }\\n \\n /* neutral point */\\n Prec[0][0]=0;\\n Prec[0][1]=0;\\n \\n \\t\\n for(uint i=1;i<256;i++)\\n { \\n Prec[i][0]=0;\\n Prec[i][1]=0;\\n \\n for(uint j=0;j<8;j++)\\n {\\n \\tif( (i&(1<=0.8.19 <0.9.0;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if ( ((0 == x)&&( 0 == y)) || x == p || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates. Deal with P=Q\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n if((x0==x1)&&(y0==y1)) {\\n (x0, y0, zz0, zzz0) = ecZZ_Dbl(x0, y0,1,1);\\n }\\n else{\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n }\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); \\n if((H0==0)&&(H1==0))//handling Q=-G\\n {\\n scalar_u=addmod(scalar_u, n-scalar_v, n);\\n scalar_v=0;\\n\\n }\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := mulmod(addmod(X, zz, p), addmod(X, sub(p, zz), p), p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M=3*(X-ZZ)(X+ZZ)\\n\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n\\n\\n} //EOF\\n\",\"keccak256\":\"0xa09802f3ca65d654d56260f40db449f9fbefbadb64429772e6f133ad6370eab9\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/P256Signer.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title P256Signer\\n/// @notice A contract used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This contract is the implementation. It is meant to be used through\\n/// proxy clone.\\ncontract P256Signer {\\n /// @notice The EIP-1271 magic value\\n bytes4 internal constant EIP1271_MAGICVALUE = 0x1626ba7e;\\n\\n /// @notice The old EIP-1271 magic value\\n bytes4 internal constant OLD_EIP1271_MAGICVALUE = 0x20c13b0b;\\n\\n /// @notice Whether the contract has been initialized\\n bool public initialized;\\n\\n /// @notice The x coordinate of the secp256r1 public key\\n uint256 public x;\\n\\n /// @notice The y coordinate of the secp256r1 public key\\n uint256 public y;\\n\\n /// @notice Error message when the signature is invalid\\n error InvalidSignature();\\n\\n /// @notice Error message when the hash is invalid\\n error InvalidHash();\\n\\n /// @notice Error message when the contract is already initialized\\n error AlreadyInitialized();\\n\\n constructor() {\\n initialized = true;\\n }\\n\\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\\n /// @param _hash The hash of the data signed\\n /// @param _signature The signature\\n /// @return The EIP-1271 magic value\\n function isValidSignature(bytes32 _hash, bytes calldata _signature) public view returns (bytes4) {\\n _validate(abi.encode(_hash), _signature);\\n return EIP1271_MAGICVALUE;\\n }\\n\\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\\n /// @dev This is the old version of the function of EIP-1271 using bytes\\n /// memory instead of bytes32\\n /// @param _hash The hash of the data signed\\n /// @param _signature The signature\\n /// @return The EIP-1271 magic value\\n function isValidSignature(bytes memory _hash, bytes calldata _signature) public view returns (bytes4) {\\n _validate(_hash, _signature);\\n return OLD_EIP1271_MAGICVALUE;\\n }\\n\\n struct SignatureLayout {\\n bytes authenticatorData;\\n bytes clientData;\\n uint256 challengeOffset;\\n uint256[2] rs;\\n }\\n\\n /// @notice Validates the signature\\n /// @param data The data signed\\n /// @param _signature The signature\\n function _validate(bytes memory data, bytes calldata _signature) private view {\\n bytes32 _hash = keccak256(data);\\n SignatureLayout calldata signaturePointer;\\n // This code should precalculate the offsets of variables as defined in the layout\\n // Calldata variables are represented as offsets, and, I think, length for dynamic types\\n // If the calldata is malformed (e.g., shorter than expected), this will revert with an out of bounds error\\n assembly {\\n signaturePointer := _signature.offset\\n }\\n\\n bool valid = FCL_WebAuthn.checkSignature(\\n signaturePointer.authenticatorData,\\n 0x01,\\n signaturePointer.clientData,\\n _hash,\\n signaturePointer.challengeOffset,\\n signaturePointer.rs,\\n x,\\n y\\n );\\n\\n if (!valid) revert InvalidSignature();\\n }\\n\\n /// @dev This function is only callable once and needs to be called immediately\\n /// after deployment by the factory in the same transaction.\\n /// @param x_ The x coordinate of the public key\\n /// @param y_ The y coordinate of the public key\\n function initialize(uint256 x_, uint256 y_) external {\\n if (initialized) revert AlreadyInitialized();\\n initialized = true;\\n x = x_;\\n y = y_;\\n }\\n}\\n\",\"keccak256\":\"0xfc1b006adb6ace0364918015a1aa64439374f813383bcc71290f6b37b66641e5\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506000805460ff1916600117905561204b8061002d6000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c806320c13b0b1161005057806320c13b0b146100f4578063a56dfe4a14610107578063e4a301161461011057600080fd5b80630c55699c14610077578063158ef93e146100935780631626ba7e146100b0575b600080fd5b61008060015481565b6040519081526020015b60405180910390f35b6000546100a09060ff1681565b604051901515815260200161008a565b6100c36100be366004611cb9565b610125565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161008a565b6100c3610102366004611d34565b61017c565b61008060025481565b61012361011e366004611e20565b6101b2565b005b60006101538460405160200161013d91815260200190565b6040516020818303038152906040528484610226565b507f1626ba7e000000000000000000000000000000000000000000000000000000009392505050565b6000610189848484610226565b507f20c13b0b000000000000000000000000000000000000000000000000000000009392505050565b60005460ff16156101ef576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591909155600255565b8251602084012082600061028061023d8380611e42565b7f010000000000000000000000000000000000000000000000000000000000000061026b6020870187611e42565b888860400135896060016001546002546102c1565b9050806102b9576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000806102d48c8c8c8c8c8c8c8c6102f5565b905060006102e482878787610598565b9d9c50505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a602081811061032e5761032e611ea7565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610392576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103be856040516020016103aa91815260200190565b6040516020818303038152906040526106f7565b90506000815167ffffffffffffffff8111156103dc576103dc611d05565b6040519080825280601f01601f191660200182016040528015610406576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016104309190611ed6565b604051602081830303815290604052805190602001201461047d576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061048f9050896020611f34565b67ffffffffffffffff8111156104a7576104a7611d05565b6040519080825280601f01601f1916602001820160405280156104d1576020820181803683370190505b509050888a60208301376000600288886040516104ef929190611f47565b602060405180830381855afa15801561050c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061052f9190611f57565b90508060208b018301526002826040516105499190611ed6565b602060405180830381855afa158015610566573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906105899190611f57565b9b9a5050505050505050505050565b6000833560208501358115806105ce57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b806105d7575080155b8061060257507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b15610612576000925050506106ef565b61061c8585610866565b61062b576000925050506106ef565b6000610636826109e0565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828a09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518386099050600061069689898585610a64565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325516106e3877fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611f70565b82081596505050505050505b949350505050565b6060815160000361071657505060408051602081019091526000815290565b6000604051806060016040528060408152602001611fd660409139905060006003845160026107459190611f34565b61074f9190611f83565b61075a906004611fbe565b67ffffffffffffffff81111561077257610772611d05565b6040519080825280601f01601f19166020018201604052801561079c576020820181803683370190505b509050600182016020820185865187015b80821015610808576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506107ad565b5050600386510660018114610824576002811461082f57610836565b600282039150610836565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158015610874575081155b8061089e57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806108c857507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156108d5575060006109da565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa610a5d57600080fd5b5192915050565b600080808060ff818088158015610a79575087155b15610a8d57600096505050505050506106ef565b610ad97f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d611561565b909250905081158015610aea575080155b15610b3c577fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038a089850600097505b600189841c16600189851c1660011b015b80610b6f5760018403935060018a851c1660018a861c1660011b019050610b4d565b50600189841c16600189851c1660011b01955060018603610bd1577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610be0578a96508993505b60038603610bef578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11156114b1577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610eda57877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff039750505050506114a6565b60018103610f29577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610f38578e93508d92505b60038103610f47578593508492505b89610f6057509198506001975087965094506114a69050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061129f578361129f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f080990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8160030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a860999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a87098508985050505050506114a6565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610bfe565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61152c57600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099c9b505050505050505050505050565b6000808080866115785785859350935050506115e6565b8461158a5787879350935050506115e6565b858814801561159857508487145b156115b9576115aa88886001806115ef565b929a50909850925090506115d3565b6115c888886001808a8a611879565b929a50909850925090505b6115df88888484611b3e565b9350935050505b94509492505050565b6000806000807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8760020993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82890990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff888b087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038c080960030995507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8889090893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038308870997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85840990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808885097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff0389089250945094509450949050565b6000806000808860000361189857508492508391506001905080611b31565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b6000806000611b4c84611bf3565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa610a5d57600080fd5b60008083601f840112611c8257600080fd5b50813567ffffffffffffffff811115611c9a57600080fd5b602083019150836020828501011115611cb257600080fd5b9250929050565b600080600060408486031215611cce57600080fd5b83359250602084013567ffffffffffffffff811115611cec57600080fd5b611cf886828701611c70565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060408486031215611d4957600080fd5b833567ffffffffffffffff80821115611d6157600080fd5b818601915086601f830112611d7557600080fd5b813581811115611d8757611d87611d05565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611dcd57611dcd611d05565b81604052828152896020848701011115611de657600080fd5b826020860160208301376000602084830101528097505050506020860135915080821115611e1357600080fd5b50611cf886828701611c70565b60008060408385031215611e3357600080fd5b50508035926020909101359150565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e7757600080fd5b83018035915067ffffffffffffffff821115611e9257600080fd5b602001915036819003821315611cb257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ef75760208186018101518583015201611edd565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156109da576109da611f05565b8183823760009101908152919050565b600060208284031215611f6957600080fd5b5051919050565b818103818111156109da576109da611f05565b600082611fb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820281158282048414176109da576109da611f0556fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa264697066735822122010b19bcb302b393f0f07ede9ec3810838497a4931544263dc93726e735cb3b0e64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c806320c13b0b1161005057806320c13b0b146100f4578063a56dfe4a14610107578063e4a301161461011057600080fd5b80630c55699c14610077578063158ef93e146100935780631626ba7e146100b0575b600080fd5b61008060015481565b6040519081526020015b60405180910390f35b6000546100a09060ff1681565b604051901515815260200161008a565b6100c36100be366004611cb9565b610125565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161008a565b6100c3610102366004611d34565b61017c565b61008060025481565b61012361011e366004611e20565b6101b2565b005b60006101538460405160200161013d91815260200190565b6040516020818303038152906040528484610226565b507f1626ba7e000000000000000000000000000000000000000000000000000000009392505050565b6000610189848484610226565b507f20c13b0b000000000000000000000000000000000000000000000000000000009392505050565b60005460ff16156101ef576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591909155600255565b8251602084012082600061028061023d8380611e42565b7f010000000000000000000000000000000000000000000000000000000000000061026b6020870187611e42565b888860400135896060016001546002546102c1565b9050806102b9576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000806102d48c8c8c8c8c8c8c8c6102f5565b905060006102e482878787610598565b9d9c50505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a602081811061032e5761032e611ea7565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610392576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103be856040516020016103aa91815260200190565b6040516020818303038152906040526106f7565b90506000815167ffffffffffffffff8111156103dc576103dc611d05565b6040519080825280601f01601f191660200182016040528015610406576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016104309190611ed6565b604051602081830303815290604052805190602001201461047d576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061048f9050896020611f34565b67ffffffffffffffff8111156104a7576104a7611d05565b6040519080825280601f01601f1916602001820160405280156104d1576020820181803683370190505b509050888a60208301376000600288886040516104ef929190611f47565b602060405180830381855afa15801561050c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061052f9190611f57565b90508060208b018301526002826040516105499190611ed6565b602060405180830381855afa158015610566573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906105899190611f57565b9b9a5050505050505050505050565b6000833560208501358115806105ce57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b806105d7575080155b8061060257507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b15610612576000925050506106ef565b61061c8585610866565b61062b576000925050506106ef565b6000610636826109e0565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828a09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518386099050600061069689898585610a64565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325516106e3877fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611f70565b82081596505050505050505b949350505050565b6060815160000361071657505060408051602081019091526000815290565b6000604051806060016040528060408152602001611fd660409139905060006003845160026107459190611f34565b61074f9190611f83565b61075a906004611fbe565b67ffffffffffffffff81111561077257610772611d05565b6040519080825280601f01601f19166020018201604052801561079c576020820181803683370190505b509050600182016020820185865187015b80821015610808576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506107ad565b5050600386510660018114610824576002811461082f57610836565b600282039150610836565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158015610874575081155b8061089e57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806108c857507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156108d5575060006109da565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa610a5d57600080fd5b5192915050565b600080808060ff818088158015610a79575087155b15610a8d57600096505050505050506106ef565b610ad97f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d611561565b909250905081158015610aea575080155b15610b3c577fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038a089850600097505b600189841c16600189851c1660011b015b80610b6f5760018403935060018a851c1660018a861c1660011b019050610b4d565b50600189841c16600189851c1660011b01955060018603610bd1577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610be0578a96508993505b60038603610bef578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11156114b1577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610eda57877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff039750505050506114a6565b60018103610f29577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610f38578e93508d92505b60038103610f47578593508492505b89610f6057509198506001975087965094506114a69050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061129f578361129f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f080990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8160030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a860999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a87098508985050505050506114a6565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610bfe565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61152c57600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099c9b505050505050505050505050565b6000808080866115785785859350935050506115e6565b8461158a5787879350935050506115e6565b858814801561159857508487145b156115b9576115aa88886001806115ef565b929a50909850925090506115d3565b6115c888886001808a8a611879565b929a50909850925090505b6115df88888484611b3e565b9350935050505b94509492505050565b6000806000807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8760020993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82890990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff888b087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038c080960030995507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8889090893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038308870997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85840990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808885097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff0389089250945094509450949050565b6000806000808860000361189857508492508391506001905080611b31565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b6000806000611b4c84611bf3565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa610a5d57600080fd5b60008083601f840112611c8257600080fd5b50813567ffffffffffffffff811115611c9a57600080fd5b602083019150836020828501011115611cb257600080fd5b9250929050565b600080600060408486031215611cce57600080fd5b83359250602084013567ffffffffffffffff811115611cec57600080fd5b611cf886828701611c70565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060408486031215611d4957600080fd5b833567ffffffffffffffff80821115611d6157600080fd5b818601915086601f830112611d7557600080fd5b813581811115611d8757611d87611d05565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611dcd57611dcd611d05565b81604052828152896020848701011115611de657600080fd5b826020860160208301376000602084830101528097505050506020860135915080821115611e1357600080fd5b50611cf886828701611c70565b60008060408385031215611e3357600080fd5b50508035926020909101359150565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e7757600080fd5b83018035915067ffffffffffffffff821115611e9257600080fd5b602001915036819003821315611cb257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ef75760208186018101518583015201611edd565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156109da576109da611f05565b8183823760009101908152919050565b600060208284031215611f6957600080fd5b5051919050565b818103818111156109da576109da611f05565b600082611fb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820281158282048414176109da576109da611f0556fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa264697066735822122010b19bcb302b393f0f07ede9ec3810838497a4931544263dc93726e735cb3b0e64736f6c63430008140033", + "devdoc": { + "details": "This contract is the implementation. It is meant to be used through proxy clone.", + "kind": "dev", + "methods": { + "initialize(uint256,uint256)": { + "details": "This function is only callable once and needs to be called immediately after deployment by the factory in the same transaction.", + "params": { + "x_": "The x coordinate of the public key", + "y_": "The y coordinate of the public key" + } + }, + "isValidSignature(bytes,bytes)": { + "details": "This is the old version of the function of EIP-1271 using bytes memory instead of bytes32", + "params": { + "_hash": "The hash of the data signed", + "_signature": "The signature" + }, + "returns": { + "_0": "The EIP-1271 magic value" + } + }, + "isValidSignature(bytes32,bytes)": { + "params": { + "_hash": "The hash of the data signed", + "_signature": "The signature" + }, + "returns": { + "_0": "The EIP-1271 magic value" + } + } + }, + "title": "P256Signer", + "version": 1 + }, + "userdoc": { + "errors": { + "AlreadyInitialized()": [ + { + "notice": "Error message when the contract is already initialized" + } + ], + "InvalidHash()": [ + { + "notice": "Error message when the hash is invalid" + } + ], + "InvalidSignature()": [ + { + "notice": "Error message when the signature is invalid" + } + ] + }, + "kind": "user", + "methods": { + "initialized()": { + "notice": "Whether the contract has been initialized" + }, + "isValidSignature(bytes,bytes)": { + "notice": "Verifies that the signer is the owner of the secp256r1 public key." + }, + "isValidSignature(bytes32,bytes)": { + "notice": "Verifies that the signer is the owner of the secp256r1 public key." + }, + "x()": { + "notice": "The x coordinate of the secp256r1 public key" + }, + "y()": { + "notice": "The y coordinate of the secp256r1 public key" + } + }, + "notice": "A contract used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 2859, + "contract": "contracts/P256Signer.sol:P256Signer", + "label": "initialized", + "offset": 0, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 2862, + "contract": "contracts/P256Signer.sol:P256Signer", + "label": "x", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 2865, + "contract": "contracts/P256Signer.sol:P256Signer", + "label": "y", + "offset": 0, + "slot": "2", + "type": "t_uint256" + } + ], + "types": { + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/deployments/muster/P256SignerFactory.json b/deployments/muster/P256SignerFactory.json new file mode 100644 index 0000000..a7f649d --- /dev/null +++ b/deployments/muster/P256SignerFactory.json @@ -0,0 +1,137 @@ +{ + "address": "0x841Da89727BB8c0807738230e3781D07b659653D", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "y", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "NewSignerCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x173507bd701822d5505f8caeb539b7e446b5581f941dc1e3f41bd22b86924e10", + "receipt": { + "to": "0x6A78a27E52fa669C0a5246574Ece2e9a64c483B1", + "from": "0xda677C8877E49Dfc31dC7e92fA7615F4Fb4047D7", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "218082", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xb57d9a2279c79afb69c2802a99aea2bcf658253530d3bbd3d5ea967f60c58063", + "transactionHash": "0x173507bd701822d5505f8caeb539b7e446b5581f941dc1e3f41bd22b86924e10", + "logs": [], + "blockNumber": 109, + "cumulativeGasUsed": "218082", + "status": 1, + "byzantium": true + }, + "args": [ + "0x52E7e05A9F333c17A5b86e92799e9b7aD13d3503" + ], + "numDeployments": 1, + "solcInputHash": "c99418166b2fc7a84fdc0f742530dbd8", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"NewSignerCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"create(uint256,uint256)\":{\"params\":{\"x\":\"The x coordinate of the public key\",\"y\":\"The y coordinate of the public key\"}}},\"title\":\"P256SignerFactory\",\"version\":1},\"userdoc\":{\"events\":{\"NewSignerCreated(uint256,uint256,address)\":{\"notice\":\"Emitted when a new P256Signer proxy contract is created\"}},\"kind\":\"user\",\"methods\":{\"create(uint256,uint256)\":{\"notice\":\"Creates a new P256Signer proxy contract\"},\"implementation()\":{\"notice\":\"The implementation address of the P256Signer contract\"}},\"notice\":\"Factory contract for creating proxies for P256Signer\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/P256SignerFactory.sol\":\"P256SignerFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\nimport {FCL_ecdsa} from \\\"./FCL_ecdsa.sol\\\";\\n\\nimport {FCL_ecdsa_utils} from \\\"./FCL_ecdsa_utils.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n return checkSignature(authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs, Q[0], Q[1]);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 Qx,\\n uint256 Qy\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_ecdsa_utils.ecdsa_verify(message, rs, Qx, Qy);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_ecdsa.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xc2811ef6e17ea1d5509a3d3f7d5af5e56583347b36093d05530425d7c1316dd6\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_ecdsa.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_ecdsa.sol\\n///*\\n///*\\n///* DESCRIPTION: ecdsa verification implementation\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\n\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\n\\n\\nlibrary FCL_ecdsa {\\n // Set parameters for curve sec256r1.public\\n //curve order (number of points)\\n uint256 constant n = FCL_Elliptic_ZZ.n;\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key, no calldata version\\n */\\n function ecdsa_verify(bytes32 message, uint256 r, uint256 s, uint256 Qx, uint256 Qy) internal view returns (bool){\\n\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return false;\\n }\\n \\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\\n uint256 x1;\\n\\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\\n\\n x1= addmod(x1, n-r,n );\\n \\n return x1 == 0;\\n }\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\\n {\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return address(0);\\n }\\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256 r, uint256 s, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n \\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n X= addmod(X, n-r,n );\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n X= addmod(X, n-r,n );\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n}\\n\",\"keccak256\":\"0x679d2e9a655cd7e156a0cfc24de0aca88d4e0b34a8e0dfe6a599f23af092f5a2\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_ecdsa_utils.sol\":{\"content\":\"\\n//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_ecdsa.sol\\n///*\\n///*\\n///* DESCRIPTION: ecdsa verification implementation\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\n\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\n\\n\\nlibrary FCL_ecdsa_utils {\\n // Set parameters for curve sec256r1.public\\n //curve order (number of points)\\n uint256 constant n = FCL_Elliptic_ZZ.n;\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256 Qx, uint256 Qy) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return false;\\n }\\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\\n uint256 x1;\\n\\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\\n x1= addmod(x1, n-r,n );\\n \\n \\n return x1 == 0;\\n }\\n\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n return ecdsa_verify(message, rs, Q[0], Q[1]);\\n }\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\\n {\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return address(0);\\n }\\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) internal view returns(uint256 r, uint256 s)\\n {\\n r=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, FCL_Elliptic_ZZ.n); \\n s=mulmod(FCL_Elliptic_ZZ.FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n //ecdsa key derivation\\n //kpriv is private key return (x,y) coordinates of associated Pubkey\\n function ecdsa_derivKpub(uint256 kpriv) internal view returns(uint256 x, uint256 y)\\n {\\n \\n x=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, kpriv, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n y=FCL_Elliptic_ZZ.ec_Decompress(x, 1);\\n \\n if (FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(x, y, kpriv, FCL_Elliptic_ZZ.n - 1) != 0) //extract correct y value\\n {\\n y=FCL_Elliptic_ZZ.p-y;\\n } \\n\\n }\\n \\n //precomputations for 8 dimensional trick\\n function Precalc_8dim( uint256 Qx, uint256 Qy) internal view returns( uint[2][256] memory Prec)\\n {\\n \\n uint[2][8] memory Pow64_PQ; //store P, 64P, 128P, 192P, Q, 64Q, 128Q, 192Q\\n \\n //the trivial private keys 1 and -1 are forbidden\\n if(Qx==FCL_Elliptic_ZZ.gx)\\n {\\n revert();\\n }\\n Pow64_PQ[0][0]=FCL_Elliptic_ZZ.gx;\\n Pow64_PQ[0][1]=FCL_Elliptic_ZZ.gy;\\n \\n Pow64_PQ[4][0]=Qx;\\n Pow64_PQ[4][1]=Qy;\\n \\n /* raise to multiplication by 64 by 6 consecutive doubling*/\\n for(uint j=1;j<4;j++){\\n uint256 x;\\n uint256 y;\\n uint256 zz;\\n uint256 zzz;\\n \\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j-1][0], Pow64_PQ[j-1][1], 1, 1);\\n \\t(Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n (x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+3][0], Pow64_PQ[j+3][1], 1, 1);\\n \\t(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n\\n \\tfor(uint i=0;i<63;i++){\\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j][0], Pow64_PQ[j][1],1,1);\\n (Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1],1,1);\\n (Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n \\t}\\n }\\n \\n /* neutral point */\\n Prec[0][0]=0;\\n Prec[0][1]=0;\\n \\n \\t\\n for(uint i=1;i<256;i++)\\n { \\n Prec[i][0]=0;\\n Prec[i][1]=0;\\n \\n for(uint j=0;j<8;j++)\\n {\\n \\tif( (i&(1<=0.8.19 <0.9.0;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if ( ((0 == x)&&( 0 == y)) || x == p || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates. Deal with P=Q\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n if((x0==x1)&&(y0==y1)) {\\n (x0, y0, zz0, zzz0) = ecZZ_Dbl(x0, y0,1,1);\\n }\\n else{\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n }\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); \\n if((H0==0)&&(H1==0))//handling Q=-G\\n {\\n scalar_u=addmod(scalar_u, n-scalar_v, n);\\n scalar_v=0;\\n\\n }\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := mulmod(addmod(X, zz, p), addmod(X, sub(p, zz), p), p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M=3*(X-ZZ)(X+ZZ)\\n\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n\\n\\n} //EOF\\n\",\"keccak256\":\"0xa09802f3ca65d654d56260f40db449f9fbefbadb64429772e6f133ad6370eab9\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/P256Signer.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title P256Signer\\n/// @notice A contract used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This contract is the implementation. It is meant to be used through\\n/// proxy clone.\\ncontract P256Signer {\\n /// @notice The EIP-1271 magic value\\n bytes4 internal constant EIP1271_MAGICVALUE = 0x1626ba7e;\\n\\n /// @notice The old EIP-1271 magic value\\n bytes4 internal constant OLD_EIP1271_MAGICVALUE = 0x20c13b0b;\\n\\n /// @notice Whether the contract has been initialized\\n bool public initialized;\\n\\n /// @notice The x coordinate of the secp256r1 public key\\n uint256 public x;\\n\\n /// @notice The y coordinate of the secp256r1 public key\\n uint256 public y;\\n\\n /// @notice Error message when the signature is invalid\\n error InvalidSignature();\\n\\n /// @notice Error message when the hash is invalid\\n error InvalidHash();\\n\\n /// @notice Error message when the contract is already initialized\\n error AlreadyInitialized();\\n\\n constructor() {\\n initialized = true;\\n }\\n\\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\\n /// @param _hash The hash of the data signed\\n /// @param _signature The signature\\n /// @return The EIP-1271 magic value\\n function isValidSignature(bytes32 _hash, bytes calldata _signature) public view returns (bytes4) {\\n _validate(abi.encode(_hash), _signature);\\n return EIP1271_MAGICVALUE;\\n }\\n\\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\\n /// @dev This is the old version of the function of EIP-1271 using bytes\\n /// memory instead of bytes32\\n /// @param _hash The hash of the data signed\\n /// @param _signature The signature\\n /// @return The EIP-1271 magic value\\n function isValidSignature(bytes memory _hash, bytes calldata _signature) public view returns (bytes4) {\\n _validate(_hash, _signature);\\n return OLD_EIP1271_MAGICVALUE;\\n }\\n\\n struct SignatureLayout {\\n bytes authenticatorData;\\n bytes clientData;\\n uint256 challengeOffset;\\n uint256[2] rs;\\n }\\n\\n /// @notice Validates the signature\\n /// @param data The data signed\\n /// @param _signature The signature\\n function _validate(bytes memory data, bytes calldata _signature) private view {\\n bytes32 _hash = keccak256(data);\\n SignatureLayout calldata signaturePointer;\\n // This code should precalculate the offsets of variables as defined in the layout\\n // Calldata variables are represented as offsets, and, I think, length for dynamic types\\n // If the calldata is malformed (e.g., shorter than expected), this will revert with an out of bounds error\\n assembly {\\n signaturePointer := _signature.offset\\n }\\n\\n bool valid = FCL_WebAuthn.checkSignature(\\n signaturePointer.authenticatorData,\\n 0x01,\\n signaturePointer.clientData,\\n _hash,\\n signaturePointer.challengeOffset,\\n signaturePointer.rs,\\n x,\\n y\\n );\\n\\n if (!valid) revert InvalidSignature();\\n }\\n\\n /// @dev This function is only callable once and needs to be called immediately\\n /// after deployment by the factory in the same transaction.\\n /// @param x_ The x coordinate of the public key\\n /// @param y_ The y coordinate of the public key\\n function initialize(uint256 x_, uint256 y_) external {\\n if (initialized) revert AlreadyInitialized();\\n initialized = true;\\n x = x_;\\n y = y_;\\n }\\n}\\n\",\"keccak256\":\"0xfc1b006adb6ace0364918015a1aa64439374f813383bcc71290f6b37b66641e5\"},\"contracts/P256SignerFactory.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {P256Signer} from \\\"./P256Signer.sol\\\";\\nimport \\\"solady/src/utils/LibClone.sol\\\";\\n\\n/// @title P256SignerFactory\\n/// @notice Factory contract for creating proxies for P256Signer\\ncontract P256SignerFactory {\\n /// @notice The implementation address of the P256Signer contract\\n address public immutable implementation;\\n\\n constructor(address implementation_) {\\n implementation = implementation_;\\n }\\n\\n /// @notice Emitted when a new P256Signer proxy contract is created\\n event NewSignerCreated(uint256 indexed x, uint256 indexed y, address signer);\\n\\n /// @notice Creates a new P256Signer proxy contract\\n /// @param x The x coordinate of the public key\\n /// @param y The y coordinate of the public key\\n function create(uint256 x, uint256 y) external returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(x, y));\\n address signer = LibClone.cloneDeterministic(implementation, salt);\\n P256Signer(signer).initialize(x, y);\\n emit NewSignerCreated(x, y, signer);\\n return signer;\\n }\\n}\\n\",\"keccak256\":\"0x3bdac08bf7a1c4c1621474b10733f74a9487359212705bbca42ec678aa549a53\"},\"solady/src/utils/LibClone.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Minimal proxy library.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibClone.sol)\\n/// @author Minimal proxy by 0age (https://github.com/0age)\\n/// @author Clones with immutable args by wighawag, zefram.eth, Saw-mon & Natalie\\n/// (https://github.com/Saw-mon-and-Natalie/clones-with-immutable-args)\\n///\\n/// @dev Minimal proxy:\\n/// Although the sw0nt pattern saves 5 gas over the erc-1167 pattern during runtime,\\n/// it is not supported out-of-the-box on Etherscan. Hence, we choose to use the 0age pattern,\\n/// which saves 4 gas over the erc-1167 pattern during runtime, and has the smallest bytecode.\\n///\\n/// @dev Minimal proxy (PUSH0 variant):\\n/// This is a new minimal proxy that uses the PUSH0 opcode introduced during Shanghai.\\n/// It is optimized first for minimal runtime gas, then for minimal bytecode.\\n/// The PUSH0 clone functions are intentionally postfixed with a jarring \\\"_PUSH0\\\" as\\n/// many EVM chains may not support the PUSH0 opcode in the early months after Shanghai.\\n/// Please use with caution.\\n///\\n/// @dev Clones with immutable args (CWIA):\\n/// The implementation of CWIA here implements a `receive()` method that emits the\\n/// `ReceiveETH(uint256)` event. This skips the `DELEGATECALL` when there is no calldata,\\n/// enabling us to accept hard gas-capped `sends` & `transfers` for maximum backwards\\n/// composability. The minimal proxy implementation does not offer this feature.\\nlibrary LibClone {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Unable to deploy the clone.\\n error DeploymentFailed();\\n\\n /// @dev The salt must start with either the zero address or the caller.\\n error SaltDoesNotStartWithCaller();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* MINIMAL PROXY OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Deploys a clone of `implementation`.\\n function clone(address implementation) internal returns (address instance) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n /**\\n * --------------------------------------------------------------------------+\\n * CREATION (9 bytes) |\\n * --------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * --------------------------------------------------------------------------|\\n * 60 runSize | PUSH1 runSize | r | |\\n * 3d | RETURNDATASIZE | 0 r | |\\n * 81 | DUP2 | r 0 r | |\\n * 60 offset | PUSH1 offset | o r 0 r | |\\n * 3d | RETURNDATASIZE | 0 o r 0 r | |\\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\\n * f3 | RETURN | | [0..runSize): runtime code |\\n * --------------------------------------------------------------------------|\\n * RUNTIME (44 bytes) |\\n * --------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * --------------------------------------------------------------------------|\\n * |\\n * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | 0 | |\\n * 3d | RETURNDATASIZE | 0 0 | |\\n * 3d | RETURNDATASIZE | 0 0 0 | |\\n * 3d | RETURNDATASIZE | 0 0 0 0 | |\\n * |\\n * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds 0 0 0 0 | |\\n * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | |\\n * 3d | RETURNDATASIZE | 0 0 cds 0 0 0 0 | |\\n * 37 | CALLDATACOPY | 0 0 0 0 | [0..cds): calldata |\\n * |\\n * ::: delegate call to the implementation contract :::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds 0 0 0 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | [0..cds): calldata |\\n * 73 addr | PUSH20 addr | addr 0 cds 0 0 0 0 | [0..cds): calldata |\\n * 5a | GAS | gas addr 0 cds 0 0 0 0 | [0..cds): calldata |\\n * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata |\\n * |\\n * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata |\\n * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata |\\n * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata |\\n * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata |\\n * |\\n * 60 0x2a | PUSH1 0x2a | 0x2a success 0 rds | [0..rds): returndata |\\n * 57 | JUMPI | 0 rds | [0..rds): returndata |\\n * |\\n * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * fd | REVERT | | [0..rds): returndata |\\n * |\\n * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 5b | JUMPDEST | 0 rds | [0..rds): returndata |\\n * f3 | RETURN | | [0..rds): returndata |\\n * --------------------------------------------------------------------------+\\n */\\n\\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\\n mstore(0x14, implementation)\\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\\n instance := create(0, 0x0c, 0x35)\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x21, 0)\\n }\\n }\\n\\n /// @dev Deploys a deterministic clone of `implementation` with `salt`.\\n function cloneDeterministic(address implementation, bytes32 salt)\\n internal\\n returns (address instance)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\\n mstore(0x14, implementation)\\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\\n instance := create2(0, 0x0c, 0x35, salt)\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x21, 0)\\n }\\n }\\n\\n /// @dev Returns the initialization code hash of the clone of `implementation`.\\n /// Used for mining vanity addresses with create2crunch.\\n function initCodeHash(address implementation) internal pure returns (bytes32 hash) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\\n mstore(0x14, implementation)\\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\\n hash := keccak256(0x0c, 0x35)\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x21, 0)\\n }\\n }\\n\\n /// @dev Returns the address of the deterministic clone of `implementation`,\\n /// with `salt` by `deployer`.\\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\\n function predictDeterministicAddress(address implementation, bytes32 salt, address deployer)\\n internal\\n pure\\n returns (address predicted)\\n {\\n bytes32 hash = initCodeHash(implementation);\\n predicted = predictDeterministicAddress(hash, salt, deployer);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* MINIMAL PROXY OPERATIONS (PUSH0 VARIANT) */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Deploys a PUSH0 clone of `implementation`.\\n function clone_PUSH0(address implementation) internal returns (address instance) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n /**\\n * --------------------------------------------------------------------------+\\n * CREATION (9 bytes) |\\n * --------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * --------------------------------------------------------------------------|\\n * 60 runSize | PUSH1 runSize | r | |\\n * 5f | PUSH0 | 0 r | |\\n * 81 | DUP2 | r 0 r | |\\n * 60 offset | PUSH1 offset | o r 0 r | |\\n * 5f | PUSH0 | 0 o r 0 r | |\\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\\n * f3 | RETURN | | [0..runSize): runtime code |\\n * --------------------------------------------------------------------------|\\n * RUNTIME (45 bytes) |\\n * --------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * --------------------------------------------------------------------------|\\n * |\\n * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |\\n * 5f | PUSH0 | 0 | |\\n * 5f | PUSH0 | 0 0 | |\\n * |\\n * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds 0 0 | |\\n * 5f | PUSH0 | 0 cds 0 0 | |\\n * 5f | PUSH0 | 0 0 cds 0 0 | |\\n * 37 | CALLDATACOPY | 0 0 | [0..cds): calldata |\\n * |\\n * ::: delegate call to the implementation contract :::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds 0 0 | [0..cds): calldata |\\n * 5f | PUSH0 | 0 cds 0 0 | [0..cds): calldata |\\n * 73 addr | PUSH20 addr | addr 0 cds 0 0 | [0..cds): calldata |\\n * 5a | GAS | gas addr 0 cds 0 0 | [0..cds): calldata |\\n * f4 | DELEGATECALL | success | [0..cds): calldata |\\n * |\\n * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | rds success | [0..cds): calldata |\\n * 5f | PUSH0 | 0 rds success | [0..cds): calldata |\\n * 5f | PUSH0 | 0 0 rds success | [0..cds): calldata |\\n * 3e | RETURNDATACOPY | success | [0..rds): returndata |\\n * |\\n * 60 0x29 | PUSH1 0x29 | 0x29 success | [0..rds): returndata |\\n * 57 | JUMPI | | [0..rds): returndata |\\n * |\\n * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | rds | [0..rds): returndata |\\n * 5f | PUSH0 | 0 rds | [0..rds): returndata |\\n * fd | REVERT | | [0..rds): returndata |\\n * |\\n * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 5b | JUMPDEST | | [0..rds): returndata |\\n * 3d | RETURNDATASIZE | rds | [0..rds): returndata |\\n * 5f | PUSH0 | 0 rds | [0..rds): returndata |\\n * f3 | RETURN | | [0..rds): returndata |\\n * --------------------------------------------------------------------------+\\n */\\n\\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\\n mstore(0x14, implementation) // 20\\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\\n instance := create(0, 0x0e, 0x36)\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x24, 0)\\n }\\n }\\n\\n /// @dev Deploys a deterministic PUSH0 clone of `implementation` with `salt`.\\n function cloneDeterministic_PUSH0(address implementation, bytes32 salt)\\n internal\\n returns (address instance)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\\n mstore(0x14, implementation) // 20\\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\\n instance := create2(0, 0x0e, 0x36, salt)\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x24, 0)\\n }\\n }\\n\\n /// @dev Returns the initialization code hash of the PUSH0 clone of `implementation`.\\n /// Used for mining vanity addresses with create2crunch.\\n function initCodeHash_PUSH0(address implementation) internal pure returns (bytes32 hash) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\\n mstore(0x14, implementation) // 20\\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\\n hash := keccak256(0x0e, 0x36)\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x24, 0)\\n }\\n }\\n\\n /// @dev Returns the address of the deterministic PUSH0 clone of `implementation`,\\n /// with `salt` by `deployer`.\\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\\n function predictDeterministicAddress_PUSH0(\\n address implementation,\\n bytes32 salt,\\n address deployer\\n ) internal pure returns (address predicted) {\\n bytes32 hash = initCodeHash_PUSH0(implementation);\\n predicted = predictDeterministicAddress(hash, salt, deployer);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CLONES WITH IMMUTABLE ARGS OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Deploys a minimal proxy with `implementation`,\\n /// using immutable arguments encoded in `data`.\\n ///\\n /// Note: This implementation of CWIA differs from the original implementation.\\n /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.\\n function clone(address implementation, bytes memory data) internal returns (address instance) {\\n assembly {\\n // Compute the boundaries of the data and cache the memory slots around it.\\n let mBefore3 := mload(sub(data, 0x60))\\n let mBefore2 := mload(sub(data, 0x40))\\n let mBefore1 := mload(sub(data, 0x20))\\n let dataLength := mload(data)\\n let dataEnd := add(add(data, 0x20), dataLength)\\n let mAfter1 := mload(dataEnd)\\n\\n // +2 bytes for telling how much data there is appended to the call.\\n let extraLength := add(dataLength, 2)\\n // The `creationSize` is `extraLength + 108`\\n // The `runSize` is `creationSize - 10`.\\n\\n /**\\n * ---------------------------------------------------------------------------------------------------+\\n * CREATION (10 bytes) |\\n * ---------------------------------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * ---------------------------------------------------------------------------------------------------|\\n * 61 runSize | PUSH2 runSize | r | |\\n * 3d | RETURNDATASIZE | 0 r | |\\n * 81 | DUP2 | r 0 r | |\\n * 60 offset | PUSH1 offset | o r 0 r | |\\n * 3d | RETURNDATASIZE | 0 o r 0 r | |\\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\\n * f3 | RETURN | | [0..runSize): runtime code |\\n * ---------------------------------------------------------------------------------------------------|\\n * RUNTIME (98 bytes + extraLength) |\\n * ---------------------------------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * ---------------------------------------------------------------------------------------------------|\\n * |\\n * ::: if no calldata, emit event & return w/o `DELEGATECALL` ::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds | |\\n * 60 0x2c | PUSH1 0x2c | 0x2c cds | |\\n * 57 | JUMPI | | |\\n * 34 | CALLVALUE | cv | |\\n * 3d | RETURNDATASIZE | 0 cv | |\\n * 52 | MSTORE | | [0..0x20): callvalue |\\n * 7f sig | PUSH32 0x9e.. | sig | [0..0x20): callvalue |\\n * 59 | MSIZE | 0x20 sig | [0..0x20): callvalue |\\n * 3d | RETURNDATASIZE | 0 0x20 sig | [0..0x20): callvalue |\\n * a1 | LOG1 | | [0..0x20): callvalue |\\n * 00 | STOP | | [0..0x20): callvalue |\\n * 5b | JUMPDEST | | |\\n * |\\n * ::: copy calldata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds | |\\n * 3d | RETURNDATASIZE | 0 cds | |\\n * 3d | RETURNDATASIZE | 0 0 cds | |\\n * 37 | CALLDATACOPY | | [0..cds): calldata |\\n * |\\n * ::: keep some values in stack :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | 0 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | 0 0 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | 0 0 0 0 | [0..cds): calldata |\\n * 61 extra | PUSH2 extra | e 0 0 0 0 | [0..cds): calldata |\\n * |\\n * ::: copy extra data to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 80 | DUP1 | e e 0 0 0 0 | [0..cds): calldata |\\n * 60 0x62 | PUSH1 0x62 | 0x62 e e 0 0 0 0 | [0..cds): calldata |\\n * 36 | CALLDATASIZE | cds 0x62 e e 0 0 0 0 | [0..cds): calldata |\\n * 39 | CODECOPY | e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * |\\n * ::: delegate call to the implementation contract ::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 01 | ADD | cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 3d | RETURNDATASIZE | 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 73 addr | PUSH20 addr | addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 5a | GAS | gas addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * |\\n * ::: copy return data to memory ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData |\\n * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData |\\n * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata |\\n * |\\n * 60 0x60 | PUSH1 0x60 | 0x60 success 0 rds | [0..rds): returndata |\\n * 57 | JUMPI | 0 rds | [0..rds): returndata |\\n * |\\n * ::: revert ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * fd | REVERT | | [0..rds): returndata |\\n * |\\n * ::: return ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 5b | JUMPDEST | 0 rds | [0..rds): returndata |\\n * f3 | RETURN | | [0..rds): returndata |\\n * ---------------------------------------------------------------------------------------------------+\\n */\\n // Write the bytecode before the data.\\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\\n // Write the address of the implementation.\\n mstore(sub(data, 0x0d), implementation)\\n // Write the rest of the bytecode.\\n mstore(\\n sub(data, 0x21),\\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\\n )\\n // `keccak256(\\\"ReceiveETH(uint256)\\\")`\\n mstore(\\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\\n )\\n mstore(\\n // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.\\n // The actual EVM limit may be smaller and may change over time.\\n sub(data, add(0x59, lt(extraLength, 0xff9e))),\\n or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)\\n )\\n mstore(dataEnd, shl(0xf0, extraLength))\\n\\n // Create the instance.\\n instance := create(0, sub(data, 0x4c), add(extraLength, 0x6c))\\n\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n\\n // Restore the overwritten memory surrounding `data`.\\n mstore(dataEnd, mAfter1)\\n mstore(data, dataLength)\\n mstore(sub(data, 0x20), mBefore1)\\n mstore(sub(data, 0x40), mBefore2)\\n mstore(sub(data, 0x60), mBefore3)\\n }\\n }\\n\\n /// @dev Deploys a deterministic clone of `implementation`,\\n /// using immutable arguments encoded in `data`, with `salt`.\\n ///\\n /// Note: This implementation of CWIA differs from the original implementation.\\n /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.\\n function cloneDeterministic(address implementation, bytes memory data, bytes32 salt)\\n internal\\n returns (address instance)\\n {\\n assembly {\\n // Compute the boundaries of the data and cache the memory slots around it.\\n let mBefore3 := mload(sub(data, 0x60))\\n let mBefore2 := mload(sub(data, 0x40))\\n let mBefore1 := mload(sub(data, 0x20))\\n let dataLength := mload(data)\\n let dataEnd := add(add(data, 0x20), dataLength)\\n let mAfter1 := mload(dataEnd)\\n\\n // +2 bytes for telling how much data there is appended to the call.\\n let extraLength := add(dataLength, 2)\\n\\n // Write the bytecode before the data.\\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\\n // Write the address of the implementation.\\n mstore(sub(data, 0x0d), implementation)\\n // Write the rest of the bytecode.\\n mstore(\\n sub(data, 0x21),\\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\\n )\\n // `keccak256(\\\"ReceiveETH(uint256)\\\")`\\n mstore(\\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\\n )\\n mstore(\\n // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.\\n // The actual EVM limit may be smaller and may change over time.\\n sub(data, add(0x59, lt(extraLength, 0xff9e))),\\n or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)\\n )\\n mstore(dataEnd, shl(0xf0, extraLength))\\n\\n // Create the instance.\\n instance := create2(0, sub(data, 0x4c), add(extraLength, 0x6c), salt)\\n\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n\\n // Restore the overwritten memory surrounding `data`.\\n mstore(dataEnd, mAfter1)\\n mstore(data, dataLength)\\n mstore(sub(data, 0x20), mBefore1)\\n mstore(sub(data, 0x40), mBefore2)\\n mstore(sub(data, 0x60), mBefore3)\\n }\\n }\\n\\n /// @dev Returns the initialization code hash of the clone of `implementation`\\n /// using immutable arguments encoded in `data`.\\n /// Used for mining vanity addresses with create2crunch.\\n function initCodeHash(address implementation, bytes memory data)\\n internal\\n pure\\n returns (bytes32 hash)\\n {\\n assembly {\\n // Compute the boundaries of the data and cache the memory slots around it.\\n let mBefore3 := mload(sub(data, 0x60))\\n let mBefore2 := mload(sub(data, 0x40))\\n let mBefore1 := mload(sub(data, 0x20))\\n let dataLength := mload(data)\\n let dataEnd := add(add(data, 0x20), dataLength)\\n let mAfter1 := mload(dataEnd)\\n\\n // Do a out-of-gas revert if `dataLength` is too big. 0xffff - 0x02 - 0x62 = 0xff9b.\\n // The actual EVM limit may be smaller and may change over time.\\n returndatacopy(returndatasize(), returndatasize(), gt(dataLength, 0xff9b))\\n\\n // +2 bytes for telling how much data there is appended to the call.\\n let extraLength := add(dataLength, 2)\\n\\n // Write the bytecode before the data.\\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\\n // Write the address of the implementation.\\n mstore(sub(data, 0x0d), implementation)\\n // Write the rest of the bytecode.\\n mstore(\\n sub(data, 0x21),\\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\\n )\\n // `keccak256(\\\"ReceiveETH(uint256)\\\")`\\n mstore(\\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\\n )\\n mstore(\\n sub(data, 0x5a),\\n or(shl(0x78, add(extraLength, 0x62)), 0x6100003d81600a3d39f336602c57343d527f)\\n )\\n mstore(dataEnd, shl(0xf0, extraLength))\\n\\n // Compute and store the bytecode hash.\\n hash := keccak256(sub(data, 0x4c), add(extraLength, 0x6c))\\n\\n // Restore the overwritten memory surrounding `data`.\\n mstore(dataEnd, mAfter1)\\n mstore(data, dataLength)\\n mstore(sub(data, 0x20), mBefore1)\\n mstore(sub(data, 0x40), mBefore2)\\n mstore(sub(data, 0x60), mBefore3)\\n }\\n }\\n\\n /// @dev Returns the address of the deterministic clone of\\n /// `implementation` using immutable arguments encoded in `data`, with `salt`, by `deployer`.\\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\\n function predictDeterministicAddress(\\n address implementation,\\n bytes memory data,\\n bytes32 salt,\\n address deployer\\n ) internal pure returns (address predicted) {\\n bytes32 hash = initCodeHash(implementation, data);\\n predicted = predictDeterministicAddress(hash, salt, deployer);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* OTHER OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the address when a contract with initialization code hash,\\n /// `hash`, is deployed with `salt`, by `deployer`.\\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\\n function predictDeterministicAddress(bytes32 hash, bytes32 salt, address deployer)\\n internal\\n pure\\n returns (address predicted)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Compute and store the bytecode hash.\\n mstore8(0x00, 0xff) // Write the prefix.\\n mstore(0x35, hash)\\n mstore(0x01, shl(96, deployer))\\n mstore(0x15, salt)\\n predicted := keccak256(0x00, 0x55)\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x35, 0)\\n }\\n }\\n\\n /// @dev Reverts if `salt` does not start with either the zero address or the caller.\\n function checkStartsWithCaller(bytes32 salt) internal view {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // If the salt does not start with the zero address or the caller.\\n if iszero(or(iszero(shr(96, salt)), eq(caller(), shr(96, salt)))) {\\n // Store the function selector of `SaltDoesNotStartWithCaller()`.\\n mstore(0x00, 0x2f634836)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x159b64c65da9e6efe93b8df8c6bb1c7672a7511dcaba414aaa3e447f6d7065e6\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a060405234801561001057600080fd5b5060405161031a38038061031a83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b60805161028a610090600039600081816040015260d7015261028a6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80635c60da1b1461003b5780639f7b45791461008b575b600080fd5b6100627f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b610062610099366004610232565b60008083836040516020016100b8929190918252602082015260400190565b60405160208183030381529060405280519060200120905060006100fc7f0000000000000000000000000000000000000000000000000000000000000000836101db565b6040517fe4a30116000000000000000000000000000000000000000000000000000000008152600481018790526024810186905290915073ffffffffffffffffffffffffffffffffffffffff82169063e4a3011690604401600060405180830381600087803b15801561016e57600080fd5b505af1158015610182573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841681528692508791507f33b61205835e3063eb8935cac4b29d7fc333ad80d6cb11893ba4758adf8cdde19060200160405180910390a3949350505050565b60006c5af43d3d93803e602a57fd5bf36021528260145273602c3d8160093d39f33d3d3d3d363d3d37363d73600052816035600c6000f59050806102275763301164256000526004601cfd5b600060215292915050565b6000806040838503121561024557600080fd5b5050803592602090910135915056fea264697066735822122071f53aa036351be28c2415d8e5721596cc980c32c199aac9af70658e7c86902d64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80635c60da1b1461003b5780639f7b45791461008b575b600080fd5b6100627f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b610062610099366004610232565b60008083836040516020016100b8929190918252602082015260400190565b60405160208183030381529060405280519060200120905060006100fc7f0000000000000000000000000000000000000000000000000000000000000000836101db565b6040517fe4a30116000000000000000000000000000000000000000000000000000000008152600481018790526024810186905290915073ffffffffffffffffffffffffffffffffffffffff82169063e4a3011690604401600060405180830381600087803b15801561016e57600080fd5b505af1158015610182573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841681528692508791507f33b61205835e3063eb8935cac4b29d7fc333ad80d6cb11893ba4758adf8cdde19060200160405180910390a3949350505050565b60006c5af43d3d93803e602a57fd5bf36021528260145273602c3d8160093d39f33d3d3d3d363d3d37363d73600052816035600c6000f59050806102275763301164256000526004601cfd5b600060215292915050565b6000806040838503121561024557600080fd5b5050803592602090910135915056fea264697066735822122071f53aa036351be28c2415d8e5721596cc980c32c199aac9af70658e7c86902d64736f6c63430008140033", + "devdoc": { + "kind": "dev", + "methods": { + "create(uint256,uint256)": { + "params": { + "x": "The x coordinate of the public key", + "y": "The y coordinate of the public key" + } + } + }, + "title": "P256SignerFactory", + "version": 1 + }, + "userdoc": { + "events": { + "NewSignerCreated(uint256,uint256,address)": { + "notice": "Emitted when a new P256Signer proxy contract is created" + } + }, + "kind": "user", + "methods": { + "create(uint256,uint256)": { + "notice": "Creates a new P256Signer proxy contract" + }, + "implementation()": { + "notice": "The implementation address of the P256Signer contract" + } + }, + "notice": "Factory contract for creating proxies for P256Signer", + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/deployments/muster/solcInputs/c99418166b2fc7a84fdc0f742530dbd8.json b/deployments/muster/solcInputs/c99418166b2fc7a84fdc0f742530dbd8.json new file mode 100644 index 0000000..fdb6b70 --- /dev/null +++ b/deployments/muster/solcInputs/c99418166b2fc7a84fdc0f742530dbd8.json @@ -0,0 +1,57 @@ +{ + "language": "Solidity", + "sources": { + "contracts/P256Signer.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport {FCL_WebAuthn} from \"FreshCryptoLib/FCL_Webauthn.sol\";\n\n/// @title P256Signer\n/// @notice A contract used to verify ECDSA signatures over secp256r1 through\n/// EIP-1271 of Webauthn payloads.\n/// @dev This contract is the implementation. It is meant to be used through\n/// proxy clone.\ncontract P256Signer {\n /// @notice The EIP-1271 magic value\n bytes4 internal constant EIP1271_MAGICVALUE = 0x1626ba7e;\n\n /// @notice The old EIP-1271 magic value\n bytes4 internal constant OLD_EIP1271_MAGICVALUE = 0x20c13b0b;\n\n /// @notice Whether the contract has been initialized\n bool public initialized;\n\n /// @notice The x coordinate of the secp256r1 public key\n uint256 public x;\n\n /// @notice The y coordinate of the secp256r1 public key\n uint256 public y;\n\n /// @notice Error message when the signature is invalid\n error InvalidSignature();\n\n /// @notice Error message when the hash is invalid\n error InvalidHash();\n\n /// @notice Error message when the contract is already initialized\n error AlreadyInitialized();\n\n constructor() {\n initialized = true;\n }\n\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\n /// @param _hash The hash of the data signed\n /// @param _signature The signature\n /// @return The EIP-1271 magic value\n function isValidSignature(bytes32 _hash, bytes calldata _signature) public view returns (bytes4) {\n _validate(abi.encode(_hash), _signature);\n return EIP1271_MAGICVALUE;\n }\n\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\n /// @dev This is the old version of the function of EIP-1271 using bytes\n /// memory instead of bytes32\n /// @param _hash The hash of the data signed\n /// @param _signature The signature\n /// @return The EIP-1271 magic value\n function isValidSignature(bytes memory _hash, bytes calldata _signature) public view returns (bytes4) {\n _validate(_hash, _signature);\n return OLD_EIP1271_MAGICVALUE;\n }\n\n struct SignatureLayout {\n bytes authenticatorData;\n bytes clientData;\n uint256 challengeOffset;\n uint256[2] rs;\n }\n\n /// @notice Validates the signature\n /// @param data The data signed\n /// @param _signature The signature\n function _validate(bytes memory data, bytes calldata _signature) private view {\n bytes32 _hash = keccak256(data);\n SignatureLayout calldata signaturePointer;\n // This code should precalculate the offsets of variables as defined in the layout\n // Calldata variables are represented as offsets, and, I think, length for dynamic types\n // If the calldata is malformed (e.g., shorter than expected), this will revert with an out of bounds error\n assembly {\n signaturePointer := _signature.offset\n }\n\n bool valid = FCL_WebAuthn.checkSignature(\n signaturePointer.authenticatorData,\n 0x01,\n signaturePointer.clientData,\n _hash,\n signaturePointer.challengeOffset,\n signaturePointer.rs,\n x,\n y\n );\n\n if (!valid) revert InvalidSignature();\n }\n\n /// @dev This function is only callable once and needs to be called immediately\n /// after deployment by the factory in the same transaction.\n /// @param x_ The x coordinate of the public key\n /// @param y_ The y coordinate of the public key\n function initialize(uint256 x_, uint256 y_) external {\n if (initialized) revert AlreadyInitialized();\n initialized = true;\n x = x_;\n y = y_;\n }\n}\n" + }, + "contracts/P256SignerFactory.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport {P256Signer} from \"./P256Signer.sol\";\nimport \"solady/src/utils/LibClone.sol\";\n\n/// @title P256SignerFactory\n/// @notice Factory contract for creating proxies for P256Signer\ncontract P256SignerFactory {\n /// @notice The implementation address of the P256Signer contract\n address public immutable implementation;\n\n constructor(address implementation_) {\n implementation = implementation_;\n }\n\n /// @notice Emitted when a new P256Signer proxy contract is created\n event NewSignerCreated(uint256 indexed x, uint256 indexed y, address signer);\n\n /// @notice Creates a new P256Signer proxy contract\n /// @param x The x coordinate of the public key\n /// @param y The y coordinate of the public key\n function create(uint256 x, uint256 y) external returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(x, y));\n address signer = LibClone.cloneDeterministic(implementation, salt);\n P256Signer(signer).initialize(x, y);\n emit NewSignerCreated(x, y, signer);\n return signer;\n }\n}\n" + }, + "FreshCryptoLib/FCL_ecdsa_utils.sol": { + "content": "\n//********************************************************************************************/\n// ___ _ ___ _ _ _ _\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\n// | _| '_/ -_|_-< ' \\ | (__| '_| || | '_ \\ _/ _ \\ | |__| | '_ \\\n// |_||_| \\___/__/_||_| \\___|_| \\_, | .__/\\__\\___/ |____|_|_.__/\n// |__/|_|\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\n///* License: This software is licensed under MIT License\n///* This Code may be reused including license and copyright notice.\n///* See LICENSE file at the root folder of the project.\n///* FILE: FCL_ecdsa.sol\n///*\n///*\n///* DESCRIPTION: ecdsa verification implementation\n///*\n//**************************************************************************************/\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\n// if ever used for other curve than sec256R1\n// SPDX-License-Identifier: MIT\npragma solidity >=0.8.19 <0.9.0;\n\n\nimport {FCL_Elliptic_ZZ} from \"./FCL_elliptic.sol\";\n\n\n\nlibrary FCL_ecdsa_utils {\n // Set parameters for curve sec256r1.public\n //curve order (number of points)\n uint256 constant n = FCL_Elliptic_ZZ.n;\n \n /**\n * @dev ECDSA verification, given , signature, and public key.\n */\n\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256 Qx, uint256 Qy) internal view returns (bool) {\n uint256 r = rs[0];\n uint256 s = rs[1];\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return false;\n }\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\n return false;\n }\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\n uint256 x1;\n\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\n x1= addmod(x1, n-r,n );\n \n \n return x1 == 0;\n }\n\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\n return ecdsa_verify(message, rs, Q[0], Q[1]);\n }\n\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\n {\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return address(0);\n }\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\n\n uint256 Qx;\n uint256 Qy;\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\n\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\n }\n\n\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\n //K is nonce, kpriv is private key\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) internal view returns(uint256 r, uint256 s)\n {\n r=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\n r=addmod(0,r, FCL_Elliptic_ZZ.n); \n s=mulmod(FCL_Elliptic_ZZ.FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n);//s=k^-1.(h+r.kpriv)\n\n \n if(r==0||s==0){\n revert();\n }\n\n\n }\n\n //ecdsa key derivation\n //kpriv is private key return (x,y) coordinates of associated Pubkey\n function ecdsa_derivKpub(uint256 kpriv) internal view returns(uint256 x, uint256 y)\n {\n \n x=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, kpriv, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\n y=FCL_Elliptic_ZZ.ec_Decompress(x, 1);\n \n if (FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(x, y, kpriv, FCL_Elliptic_ZZ.n - 1) != 0) //extract correct y value\n {\n y=FCL_Elliptic_ZZ.p-y;\n } \n\n }\n \n //precomputations for 8 dimensional trick\n function Precalc_8dim( uint256 Qx, uint256 Qy) internal view returns( uint[2][256] memory Prec)\n {\n \n uint[2][8] memory Pow64_PQ; //store P, 64P, 128P, 192P, Q, 64Q, 128Q, 192Q\n \n //the trivial private keys 1 and -1 are forbidden\n if(Qx==FCL_Elliptic_ZZ.gx)\n {\n revert();\n }\n Pow64_PQ[0][0]=FCL_Elliptic_ZZ.gx;\n Pow64_PQ[0][1]=FCL_Elliptic_ZZ.gy;\n \n Pow64_PQ[4][0]=Qx;\n Pow64_PQ[4][1]=Qy;\n \n /* raise to multiplication by 64 by 6 consecutive doubling*/\n for(uint j=1;j<4;j++){\n uint256 x;\n uint256 y;\n uint256 zz;\n uint256 zzz;\n \n \t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j-1][0], Pow64_PQ[j-1][1], 1, 1);\n \t(Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\n (x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+3][0], Pow64_PQ[j+3][1], 1, 1);\n \t(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\n\n \tfor(uint i=0;i<63;i++){\n \t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j][0], Pow64_PQ[j][1],1,1);\n (Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\n \t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1],1,1);\n (Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\n \t}\n }\n \n /* neutral point */\n Prec[0][0]=0;\n Prec[0][1]=0;\n \n \t\n for(uint i=1;i<256;i++)\n { \n Prec[i][0]=0;\n Prec[i][1]=0;\n \n for(uint j=0;j<8;j++)\n {\n \tif( (i&(1<=0.8.19 <0.9.0;\n\n\nimport {FCL_Elliptic_ZZ} from \"./FCL_elliptic.sol\";\n\n\n\nlibrary FCL_ecdsa {\n // Set parameters for curve sec256r1.public\n //curve order (number of points)\n uint256 constant n = FCL_Elliptic_ZZ.n;\n \n /**\n * @dev ECDSA verification, given , signature, and public key.\n */\n\n /**\n * @dev ECDSA verification, given , signature, and public key, no calldata version\n */\n function ecdsa_verify(bytes32 message, uint256 r, uint256 s, uint256 Qx, uint256 Qy) internal view returns (bool){\n\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return false;\n }\n \n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\n return false;\n }\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\n uint256 x1;\n\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\n\n x1= addmod(x1, n-r,n );\n \n return x1 == 0;\n }\n\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\n {\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return address(0);\n }\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\n\n uint256 Qx;\n uint256 Qy;\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\n\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\n }\n\n function ecdsa_precomputed_verify(bytes32 message, uint256 r, uint256 s, address Shamir8)\n internal view\n returns (bool)\n {\n \n if (r == 0 || r >= n || s == 0 || s >= n) {\n return false;\n }\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\n if (!isOnCurve(Q[0], Q[1])) {\n return false;\n }*/\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 X;\n\n //Shamir 8 dimensions\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\n\n X= addmod(X, n-r,n );\n\n return X == 0;\n } //end ecdsa_precomputed_verify()\n\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\n internal view\n returns (bool)\n {\n uint256 r = rs[0];\n uint256 s = rs[1];\n if (r == 0 || r >= n || s == 0 || s >= n) {\n return false;\n }\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\n if (!isOnCurve(Q[0], Q[1])) {\n return false;\n }*/\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 X;\n\n //Shamir 8 dimensions\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\n\n X= addmod(X, n-r,n );\n\n return X == 0;\n } //end ecdsa_precomputed_verify()\n\n}\n" + }, + "FreshCryptoLib/FCL_elliptic.sol": { + "content": "//********************************************************************************************/\n// ___ _ ___ _ _ _ _\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\n// | _| '_/ -_|_-< ' \\ | (__| '_| || | '_ \\ _/ _ \\ | |__| | '_ \\\n// |_||_| \\___/__/_||_| \\___|_| \\_, | .__/\\__\\___/ |____|_|_.__/\n// |__/|_|\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\n///* License: This software is licensed under MIT License\n///* This Code may be reused including license and copyright notice.\n///* See LICENSE file at the root folder of the project.\n///* FILE: FCL_elliptic.sol\n///*\n///*\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\n///* optimization\n///*\n//**************************************************************************************/\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\n// if ever used for other curve than sec256R1\n// SPDX-License-Identifier: MIT\npragma solidity >=0.8.19 <0.9.0;\n\nlibrary FCL_Elliptic_ZZ {\n // Set parameters for curve sec256r1.\n\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\n //curve prime field modulus\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n //short weierstrass first coefficient\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\n //short weierstrass second coefficient\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\n //generating point affine coordinates\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\n //curve order (number of points)\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\n /* -2 mod n constant, used to speed up inversion*/\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\n\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\n //P+1 div 4\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\n //arbitrary constant to express no quadratic residuosity\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n\n /**\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\n */\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\n assembly {\n let pointer := mload(0x40)\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(pointer, 0x20)\n mstore(add(pointer, 0x20), 0x20)\n mstore(add(pointer, 0x40), 0x20)\n // Define variables base, exponent and modulus\n mstore(add(pointer, 0x60), u)\n mstore(add(pointer, 0x80), minus_2modn)\n mstore(add(pointer, 0xa0), n)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\n result := mload(pointer)\n }\n }\n /**\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\n */\n\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\n assembly {\n let pointer := mload(0x40)\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(pointer, 0x20)\n mstore(add(pointer, 0x20), 0x20)\n mstore(add(pointer, 0x40), 0x20)\n // Define variables base, exponent and modulus\n mstore(add(pointer, 0x60), u)\n mstore(add(pointer, 0x80), minus_2)\n mstore(add(pointer, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\n result := mload(pointer)\n }\n }\n\n //Coron projective shuffling, take as input alpha as blinding factor\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\n {\n \n uint256 alpha2=mulmod(alpha,alpha,p);\n \n x3=mulmod(alpha2, x,p); //alpha^-2.x\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\n\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\n \n return (x3, y3, zz3, zzz3);\n }\n\n\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\n {\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\n u2=addmod(u2, p-u1, p);// P = U2-U1\n x1=mulmod(u2, u2, p);//PP\n x2=mulmod(x1, u2, p);//PPP\n \n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\n\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\n\n return (x3, y3, zz3, zzz3);\n }\n\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\n/// @param self The integer of which to find the modular inverse\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\n\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\n assembly (\"memory-safe\") {\n // load the free memory pointer value\n let pointer := mload(0x40)\n\n // Define length of base (Bsize)\n mstore(pointer, 0x20)\n // Define the exponent size (Esize)\n mstore(add(pointer, 0x20), 0x20)\n // Define the modulus size (Msize)\n mstore(add(pointer, 0x40), 0x20)\n // Define variables base (B)\n mstore(add(pointer, 0x60), self)\n // Define the exponent (E)\n mstore(add(pointer, 0x80), pp1div4)\n // We save the point of the last argument, it will be override by the result\n // of the precompile call in order to avoid paying for the memory expansion properly\n let _result := add(pointer, 0xa0)\n // Define the modulus (M)\n mstore(_result, p)\n\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\n if iszero(\n staticcall(\n not(0), // amount of gas to send\n MODEXP_PRECOMPILE, // target\n pointer, // argsOffset\n 0xc0, // argsSize (6 * 32 bytes)\n _result, // retOffset (we override M to avoid paying for the memory expansion)\n 0x20 // retSize (32 bytes)\n )\n ) { revert(0, 0) }\n\n result := mload(_result)\n// result :=addmod(result,0,p)\n }\n if(mulmod(result,result,p)!=self){\n result=_NOTSQUARE;\n }\n \n return result;\n}\n /**\n * /* @dev Convert from affine rep to XYZZ rep\n */\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\n unchecked {\n P[2] = 1; //ZZ\n P[3] = 1; //ZZZ\n P[0] = x0;\n P[1] = y0;\n }\n }\n\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \n\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\n\n y=SqrtMod(y2);\n if(y==_NOTSQUARE){\n return _NOTONCURVE;\n }\n if((y&1)!=(parity&1)){\n y=p-y;\n }\n }\n\n /**\n * /* @dev Convert from XYZZ rep to affine rep\n */\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\n y1 = mulmod(y, zzzInv, p); //Y/zzz\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\n zzzInv = mulmod(_b, _b, p); //1/zz\n x1 = mulmod(x, zzzInv, p); //X/zz\n }\n\n /**\n * /* @dev Sutherland2008 doubling\n */\n /* The \"dbl-2008-s-1\" doubling formulas */\n\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\n internal\n pure\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\n {\n unchecked {\n assembly {\n P0 := mulmod(2, y, p) //U = 2*Y1\n P2 := mulmod(P0, P0, p) // V=U^2\n P3 := mulmod(x, P2, p) // S = X1*V\n P1 := mulmod(P0, P2, p) // W=UV\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\n }\n }\n return (P0, P1, P2, P3);\n }\n\n /**\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\n */\n\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\n internal\n pure\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\n {\n unchecked {\n if (y1 == 0) {\n return (x2, y2, 1, 1);\n }\n\n assembly {\n y1 := sub(p, y1)\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\n P0 := mulmod(x2, x2, p) //PP = P^2\n P1 := mulmod(P0, x2, p) //PPP = P*PP\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\n }\n //end assembly\n } //end unchecked\n return (P0, P1, P2, P3);\n }\n\n /**\n * @dev Return the zero curve in XYZZ coordinates.\n */\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\n return (0, 0, 0, 0);\n }\n /**\n * @dev Check if point is the neutral of the curve\n */\n\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\n return y0 == 0;\n }\n /**\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\n */\n\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\n return (0, 0);\n }\n\n /**\n * @dev Check if the curve is the zero curve in affine rep.\n */\n // uint256 x, uint256 y)\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\n return (y == 0);\n }\n\n /**\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\n */\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\n if ( ((0 == x)&&( 0 == y)) || x == p || y == p) {\n return false;\n }\n unchecked {\n uint256 LHS = mulmod(y, y, p); // y^2\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\n\n return LHS == RHS;\n }\n }\n\n /**\n * @dev Add two elliptic curve points in affine coordinates. Deal with P=Q\n */\n\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\n uint256 zz0;\n uint256 zzz0;\n\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\n if((x0==x1)&&(y0==y1)) {\n (x0, y0, zz0, zzz0) = ecZZ_Dbl(x0, y0,1,1);\n }\n else{\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\n }\n\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\n }\n\n /**\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\n * Returns only x for ECDSA use \n * */\n function ecZZ_mulmuladd_S_asm(\n uint256 Q0,\n uint256 Q1, //affine rep for input point Q\n uint256 scalar_u,\n uint256 scalar_v\n ) internal view returns (uint256 X) {\n uint256 zz;\n uint256 zzz;\n uint256 Y;\n uint256 index = 255;\n uint256 H0;\n uint256 H1;\n\n unchecked {\n if (scalar_u == 0 && scalar_v == 0) return 0;\n\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); \n if((H0==0)&&(H1==0))//handling Q=-G\n {\n scalar_u=addmod(scalar_u, n-scalar_v, n);\n scalar_v=0;\n\n }\n assembly {\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\n index := sub(index, 1)\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n } {}\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if eq(zz, 1) {\n X := gx\n Y := gy\n }\n if eq(zz, 2) {\n X := Q0\n Y := Q1\n }\n if eq(zz, 3) {\n X := H0\n Y := H1\n }\n\n index := sub(index, 1)\n zz := 1\n zzz := 1\n\n for {} gt(minus_1, index) { index := sub(index, 1) } {\n // inlined EcZZ_Dbl\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n T1 := mulmod(T1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n {\n //value of dibit\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if iszero(T4) {\n Y := sub(p, Y) //restore the -Y inversion\n continue\n } // if T4!=0\n\n if eq(T4, 1) {\n T1 := gx\n T2 := gy\n }\n if eq(T4, 2) {\n T1 := Q0\n T2 := Q1\n }\n if eq(T4, 3) {\n T1 := H0\n T2 := H1\n }\n if iszero(zz) {\n X := T1\n Y := T2\n zz := 1\n zzz := 1\n continue\n }\n // inlined EcZZ_AddN\n\n //T3:=sub(p, Y)\n //T3:=Y\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\n\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\n //todo : construct edge vector case\n if iszero(y2) {\n if iszero(T2) {\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\n T2 := mulmod(T1, T1, p) // V=U^2\n T3 := mulmod(X, T2, p) // S = X1*V\n\n T1 := mulmod(T1, T2, p) // W=UV\n y2 := mulmod(addmod(X, zz, p), addmod(X, sub(p, zz), p), p) //(X-ZZ)(X+ZZ)\n T4 := mulmod(3, y2, p) //M=3*(X-ZZ)(X+ZZ)\n\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\n\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\n\n continue\n }\n }\n\n T4 := mulmod(T2, T2, p) //PP\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\n zz := mulmod(zz, T4, p)\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\n let TT2 := mulmod(X, T4, p)\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\n\n X := T4\n }\n } //end loop\n let T := mload(0x40)\n mstore(add(T, 0x60), zz)\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n //Y:=mulmod(Y,zzz,p)//Y/zzz\n //zz :=mulmod(zz, mload(T),p) //1/z\n //zz:= mulmod(zz,zz,p) //1/zz\n X := mulmod(X, mload(T), p) //X/zz\n } //end assembly\n } //end unchecked\n\n return X;\n }\n\n\n /**\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\n * Returns affine representation of point (normalized) \n * */\n function ecZZ_mulmuladd(\n uint256 Q0,\n uint256 Q1, //affine rep for input point Q\n uint256 scalar_u,\n uint256 scalar_v\n ) internal view returns (uint256 X, uint256 Y) {\n uint256 zz;\n uint256 zzz;\n uint256 index = 255;\n uint256[6] memory T;\n uint256[2] memory H;\n \n unchecked {\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\n\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\n\n assembly {\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\n index := sub(index, 1)\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n } {}\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if eq(zz, 1) {\n X := gx\n Y := gy\n }\n if eq(zz, 2) {\n X := Q0\n Y := Q1\n }\n if eq(zz, 3) {\n Y := mload(add(H,32))\n X := mload(H)\n }\n\n index := sub(index, 1)\n zz := 1\n zzz := 1\n\n for {} gt(minus_1, index) { index := sub(index, 1) } {\n // inlined EcZZ_Dbl\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n T1 := mulmod(T1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n {\n //value of dibit\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if iszero(T4) {\n Y := sub(p, Y) //restore the -Y inversion\n continue\n } // if T4!=0\n\n if eq(T4, 1) {\n T1 := gx\n T2 := gy\n }\n if eq(T4, 2) {\n T1 := Q0\n T2 := Q1\n }\n if eq(T4, 3) {\n T1 := mload(H)\n T2 := mload(add(H,32))\n }\n if iszero(zz) {\n X := T1\n Y := T2\n zz := 1\n zzz := 1\n continue\n }\n // inlined EcZZ_AddN\n\n //T3:=sub(p, Y)\n //T3:=Y\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\n\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\n //todo : construct edge vector case\n if iszero(y2) {\n if iszero(T2) {\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\n T2 := mulmod(T1, T1, p) // V=U^2\n T3 := mulmod(X, T2, p) // S = X1*V\n\n T1 := mulmod(T1, T2, p) // W=UV\n y2 := addmod(X, zz, p) //X+ZZ\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\n T4 := mulmod(3, y2, p) //M\n\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\n\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\n\n continue\n }\n }\n\n T4 := mulmod(T2, T2, p) //PP\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\n zz := mulmod(zz, T4, p)\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\n let TT2 := mulmod(X, T4, p)\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\n\n X := T4\n }\n } //end loop\n mstore(add(T, 0x60), zzz)\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n Y:=mulmod(Y,mload(T),p)//Y/zzz\n zz :=mulmod(zz, mload(T),p) //1/z\n zz:= mulmod(zz,zz,p) //1/zz\n X := mulmod(X, zz, p) //X/zz\n } //end assembly\n } //end unchecked\n\n return (X,Y);\n }\n\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\n //contract at given address dataPointer\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\n // the external tool to generate tables from public key is in the /sage directory\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\n internal view\n returns (uint256 X /*, uint Y*/ )\n {\n unchecked {\n uint256 zz; // third and coordinates of the point\n\n uint256[6] memory T;\n zz = 256; //start index\n\n while (T[0] == 0) {\n zz = zz - 1;\n //tbd case of msb octobit is null\n T[0] = 64\n * (\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\n );\n }\n assembly {\n extcodecopy(dataPointer, T, mload(T), 64)\n let index := sub(zz, 1)\n X := mload(T)\n let Y := mload(add(T, 32))\n let zzz := 1\n zz := 1\n\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\n for {} gt(index, 191) { index := add(index, 191) } {\n //inline Double\n {\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(TT1, TT1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n let T1 := mulmod(TT1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n /* compute element to access in precomputed table */\n }\n {\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\n let index2 := sub(index, 64)\n let T3 :=\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\n let index3 := sub(index2, 64)\n let T2 :=\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\n index := sub(index3, 64)\n let T1 :=\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\n\n //tbd: check validity of formulae with (0,1) to remove conditional jump\n if iszero(T1) {\n Y := sub(p, Y)\n\n continue\n }\n extcodecopy(dataPointer, T, T1, 64)\n }\n\n {\n /* Access to precomputed table using extcodecopy hack */\n\n // inlined EcZZ_AddN\n if iszero(zz) {\n X := mload(T)\n Y := mload(add(T, 32))\n zz := 1\n zzz := 1\n\n continue\n }\n\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\n\n //special case ecAdd(P,P)=EcDbl\n if iszero(y2) {\n if iszero(T2) {\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\n T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n\n T1 := mulmod(T1, T2, p) // W=UV\n y2 := addmod(X, zz, p) //X+ZZ\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\n let T4 := mulmod(3, y2, p) //M\n\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\n\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\n\n continue\n }\n }\n\n let T4 := mulmod(T2, T2, p)\n let T1 := mulmod(T4, T2, p) //\n zz := mulmod(zz, T4, p)\n //zzz3=V*ZZ1\n zzz := mulmod(zzz, T1, p) // W=UV/\n let zz1 := mulmod(X, T4, p)\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\n }\n } //end loop\n mstore(add(T, 0x60), zz)\n\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n zz := mload(T)\n X := mulmod(X, zz, p) //X/zz\n }\n } //end unchecked\n }\n\n \n\n // improving the extcodecopy trick : append array at end of contract\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\n internal view\n returns (uint256 X /*, uint Y*/ )\n {\n uint256 zz; // third and coordinates of the point\n\n uint256[6] memory T;\n zz = 256; //start index\n\n unchecked {\n while (T[0] == 0) {\n zz = zz - 1;\n //tbd case of msb octobit is null\n T[0] = 64\n * (\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\n );\n }\n assembly {\n codecopy(T, add(mload(T), dataPointer), 64)\n X := mload(T)\n let Y := mload(add(T, 32))\n let zzz := 1\n zz := 1\n\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n T1 := mulmod(T1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n /* compute element to access in precomputed table */\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\n index := sub(index, 64)\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\n index := sub(index, 64)\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\n index := sub(index, 64)\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\n //index:=add(index,192), restore index, interleaved with loop\n\n //tbd: check validity of formulae with (0,1) to remove conditional jump\n if iszero(T4) {\n Y := sub(p, Y)\n\n continue\n }\n {\n /* Access to precomputed table using extcodecopy hack */\n codecopy(T, add(T4, dataPointer), 64)\n\n // inlined EcZZ_AddN\n\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\n T4 := mulmod(T2, T2, p)\n T1 := mulmod(T4, T2, p)\n T2 := mulmod(zz, T4, p) // W=UV\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\n let zz1 := mulmod(X, T4, p)\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\n zz := T2\n X := T4\n }\n } //end loop\n mstore(add(T, 0x60), zz)\n\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n zz := mload(T)\n X := mulmod(X, zz, p) //X/zz\n }\n } //end unchecked\n }\n\n\n /**\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\n * generation of contract bytecode for precomputations is done using sagemath code\n * (see sage directory, WebAuthn_precompute.sage)\n */\n\n /**\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\n * generation of contract bytecode for precomputations is done using sagemath code\n * (see sage directory, WebAuthn_precompute.sage)\n */\n\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\n internal view\n returns (bool)\n {\n uint256 r = rs[0];\n uint256 s = rs[1];\n if (r == 0 || r >= n || s == 0 || s >= n) {\n return false;\n }\n /* Q is pushed via bytecode assumed to be correct\n if (!isOnCurve(Q[0], Q[1])) {\n return false;\n }*/\n\n uint256 sInv = FCL_nModInv(s);\n uint256 X;\n\n //Shamir 8 dimensions\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\n\n assembly {\n X := addmod(X, sub(n, r), n)\n }\n return X == 0;\n } //end ecdsa_precomputed_verify()\n\n\n\n} //EOF\n" + }, + "FreshCryptoLib/FCL_Webauthn.sol": { + "content": "//********************************************************************************************/\n// ___ _ ___ _ _ _ _\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\n// | _| '_/ -_|_-< ' \\ | (__| '_| || | '_ \\ _/ _ \\ | |__| | '_ \\\n// |_||_| \\___/__/_||_| \\___|_| \\_, | .__/\\__\\___/ |____|_|_.__/\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\n///* License: This software is licensed under MIT License\n///* This Code may be reused including license and copyright notice.\n///* See LICENSE file at the root folder of the project.\n///* FILE: FCL_elliptic.sol\n///*\n///*\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\n//**************************************************************************************/\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\n// if ever used for other curve than sec256R1\n// SPDX-License-Identifier: MIT\npragma solidity >=0.8.19 <0.9.0;\n\nimport {Base64Url} from \"./utils/Base64Url.sol\";\nimport {FCL_Elliptic_ZZ} from \"./FCL_elliptic.sol\";\nimport {FCL_ecdsa} from \"./FCL_ecdsa.sol\";\n\nimport {FCL_ecdsa_utils} from \"./FCL_ecdsa_utils.sol\";\n\nlibrary FCL_WebAuthn {\n error InvalidAuthenticatorData();\n error InvalidClientData();\n error InvalidSignature();\n\n function WebAuthn_format(\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata // rs\n ) internal pure returns (bytes32 result) {\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\n {\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\n revert InvalidAuthenticatorData();\n }\n // Verify that clientData commits to the expected client challenge\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\n bytes memory challengeExtracted = new bytes(\n bytes(challengeEncoded).length\n );\n\n assembly {\n calldatacopy(\n add(challengeExtracted, 32),\n add(clientData.offset, clientChallengeDataOffset),\n mload(challengeExtracted)\n )\n }\n\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\n assembly {\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\n }\n\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\n revert InvalidClientData();\n }\n } //avoid stack full\n\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\n\n assembly {\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\n }\n\n bytes32 more = sha256(clientData);\n assembly {\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\n }\n\n return sha256(verifyData);\n }\n\n function checkSignature (\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata rs,\n uint256[2] calldata Q\n ) internal view returns (bool) {\n return checkSignature(authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs, Q[0], Q[1]);\n }\n\n function checkSignature (\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata rs,\n uint256 Qx,\n uint256 Qy\n ) internal view returns (bool) {\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\n\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\n );\n\n bool result = FCL_ecdsa_utils.ecdsa_verify(message, rs, Qx, Qy);\n\n return result;\n }\n\n function checkSignature_prec(\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata rs,\n address dataPointer\n ) internal view returns (bool) {\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\n\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\n );\n\n bool result = FCL_ecdsa.ecdsa_precomputed_verify(message, rs, dataPointer);\n\n return result;\n }\n\n //beware that this implementation will not be compliant with EOF\n function checkSignature_hackmem(\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata rs,\n uint256 dataPointer\n ) internal view returns (bool) {\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\n\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\n );\n\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\n\n return result;\n }\n}\n" + }, + "FreshCryptoLib/utils/Base64Url.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/**\n * @dev Encode (without '=' padding) \n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\n */\nlibrary Base64Url {\n /**\n * @dev Base64Url Encoding Table\n */\n string internal constant ENCODING_TABLE =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\n function encode(bytes memory data) internal pure returns (string memory) {\n if (data.length == 0) return \"\";\n\n // Load the table into memory\n string memory table = ENCODING_TABLE;\n\n string memory result = new string(4 * ((data.length + 2) / 3));\n\n // @solidity memory-safe-assembly\n assembly {\n let tablePtr := add(table, 1)\n let resultPtr := add(result, 32)\n\n for {\n let dataPtr := data\n let endPtr := add(data, mload(data))\n } lt(dataPtr, endPtr) {\n\n } {\n dataPtr := add(dataPtr, 3)\n let input := mload(dataPtr)\n\n mstore8(\n resultPtr,\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\n )\n resultPtr := add(resultPtr, 1)\n\n mstore8(\n resultPtr,\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\n )\n resultPtr := add(resultPtr, 1)\n\n mstore8(\n resultPtr,\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\n )\n resultPtr := add(resultPtr, 1)\n\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\n resultPtr := add(resultPtr, 1)\n }\n\n // Remove the padding adjustment logic\n switch mod(mload(data), 3)\n case 1 {\n // Adjust for the last byte of data\n resultPtr := sub(resultPtr, 2)\n }\n case 2 {\n // Adjust for the last two bytes of data\n resultPtr := sub(resultPtr, 1)\n }\n \n // Set the correct length of the result string\n mstore(result, sub(resultPtr, add(result, 32)))\n }\n\n return result; \n }\n}\n" + }, + "solady/src/utils/LibClone.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Minimal proxy library.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibClone.sol)\n/// @author Minimal proxy by 0age (https://github.com/0age)\n/// @author Clones with immutable args by wighawag, zefram.eth, Saw-mon & Natalie\n/// (https://github.com/Saw-mon-and-Natalie/clones-with-immutable-args)\n///\n/// @dev Minimal proxy:\n/// Although the sw0nt pattern saves 5 gas over the erc-1167 pattern during runtime,\n/// it is not supported out-of-the-box on Etherscan. Hence, we choose to use the 0age pattern,\n/// which saves 4 gas over the erc-1167 pattern during runtime, and has the smallest bytecode.\n///\n/// @dev Minimal proxy (PUSH0 variant):\n/// This is a new minimal proxy that uses the PUSH0 opcode introduced during Shanghai.\n/// It is optimized first for minimal runtime gas, then for minimal bytecode.\n/// The PUSH0 clone functions are intentionally postfixed with a jarring \"_PUSH0\" as\n/// many EVM chains may not support the PUSH0 opcode in the early months after Shanghai.\n/// Please use with caution.\n///\n/// @dev Clones with immutable args (CWIA):\n/// The implementation of CWIA here implements a `receive()` method that emits the\n/// `ReceiveETH(uint256)` event. This skips the `DELEGATECALL` when there is no calldata,\n/// enabling us to accept hard gas-capped `sends` & `transfers` for maximum backwards\n/// composability. The minimal proxy implementation does not offer this feature.\nlibrary LibClone {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CUSTOM ERRORS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Unable to deploy the clone.\n error DeploymentFailed();\n\n /// @dev The salt must start with either the zero address or the caller.\n error SaltDoesNotStartWithCaller();\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* MINIMAL PROXY OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Deploys a clone of `implementation`.\n function clone(address implementation) internal returns (address instance) {\n /// @solidity memory-safe-assembly\n assembly {\n /**\n * --------------------------------------------------------------------------+\n * CREATION (9 bytes) |\n * --------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * --------------------------------------------------------------------------|\n * 60 runSize | PUSH1 runSize | r | |\n * 3d | RETURNDATASIZE | 0 r | |\n * 81 | DUP2 | r 0 r | |\n * 60 offset | PUSH1 offset | o r 0 r | |\n * 3d | RETURNDATASIZE | 0 o r 0 r | |\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\n * f3 | RETURN | | [0..runSize): runtime code |\n * --------------------------------------------------------------------------|\n * RUNTIME (44 bytes) |\n * --------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * --------------------------------------------------------------------------|\n * |\n * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | 0 | |\n * 3d | RETURNDATASIZE | 0 0 | |\n * 3d | RETURNDATASIZE | 0 0 0 | |\n * 3d | RETURNDATASIZE | 0 0 0 0 | |\n * |\n * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds 0 0 0 0 | |\n * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | |\n * 3d | RETURNDATASIZE | 0 0 cds 0 0 0 0 | |\n * 37 | CALLDATACOPY | 0 0 0 0 | [0..cds): calldata |\n * |\n * ::: delegate call to the implementation contract :::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds 0 0 0 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | [0..cds): calldata |\n * 73 addr | PUSH20 addr | addr 0 cds 0 0 0 0 | [0..cds): calldata |\n * 5a | GAS | gas addr 0 cds 0 0 0 0 | [0..cds): calldata |\n * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata |\n * |\n * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata |\n * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata |\n * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata |\n * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata |\n * |\n * 60 0x2a | PUSH1 0x2a | 0x2a success 0 rds | [0..rds): returndata |\n * 57 | JUMPI | 0 rds | [0..rds): returndata |\n * |\n * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * fd | REVERT | | [0..rds): returndata |\n * |\n * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 5b | JUMPDEST | 0 rds | [0..rds): returndata |\n * f3 | RETURN | | [0..rds): returndata |\n * --------------------------------------------------------------------------+\n */\n\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\n mstore(0x14, implementation)\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\n instance := create(0, 0x0c, 0x35)\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x21, 0)\n }\n }\n\n /// @dev Deploys a deterministic clone of `implementation` with `salt`.\n function cloneDeterministic(address implementation, bytes32 salt)\n internal\n returns (address instance)\n {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\n mstore(0x14, implementation)\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\n instance := create2(0, 0x0c, 0x35, salt)\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x21, 0)\n }\n }\n\n /// @dev Returns the initialization code hash of the clone of `implementation`.\n /// Used for mining vanity addresses with create2crunch.\n function initCodeHash(address implementation) internal pure returns (bytes32 hash) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\n mstore(0x14, implementation)\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\n hash := keccak256(0x0c, 0x35)\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x21, 0)\n }\n }\n\n /// @dev Returns the address of the deterministic clone of `implementation`,\n /// with `salt` by `deployer`.\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\n function predictDeterministicAddress(address implementation, bytes32 salt, address deployer)\n internal\n pure\n returns (address predicted)\n {\n bytes32 hash = initCodeHash(implementation);\n predicted = predictDeterministicAddress(hash, salt, deployer);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* MINIMAL PROXY OPERATIONS (PUSH0 VARIANT) */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Deploys a PUSH0 clone of `implementation`.\n function clone_PUSH0(address implementation) internal returns (address instance) {\n /// @solidity memory-safe-assembly\n assembly {\n /**\n * --------------------------------------------------------------------------+\n * CREATION (9 bytes) |\n * --------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * --------------------------------------------------------------------------|\n * 60 runSize | PUSH1 runSize | r | |\n * 5f | PUSH0 | 0 r | |\n * 81 | DUP2 | r 0 r | |\n * 60 offset | PUSH1 offset | o r 0 r | |\n * 5f | PUSH0 | 0 o r 0 r | |\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\n * f3 | RETURN | | [0..runSize): runtime code |\n * --------------------------------------------------------------------------|\n * RUNTIME (45 bytes) |\n * --------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * --------------------------------------------------------------------------|\n * |\n * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |\n * 5f | PUSH0 | 0 | |\n * 5f | PUSH0 | 0 0 | |\n * |\n * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds 0 0 | |\n * 5f | PUSH0 | 0 cds 0 0 | |\n * 5f | PUSH0 | 0 0 cds 0 0 | |\n * 37 | CALLDATACOPY | 0 0 | [0..cds): calldata |\n * |\n * ::: delegate call to the implementation contract :::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds 0 0 | [0..cds): calldata |\n * 5f | PUSH0 | 0 cds 0 0 | [0..cds): calldata |\n * 73 addr | PUSH20 addr | addr 0 cds 0 0 | [0..cds): calldata |\n * 5a | GAS | gas addr 0 cds 0 0 | [0..cds): calldata |\n * f4 | DELEGATECALL | success | [0..cds): calldata |\n * |\n * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | rds success | [0..cds): calldata |\n * 5f | PUSH0 | 0 rds success | [0..cds): calldata |\n * 5f | PUSH0 | 0 0 rds success | [0..cds): calldata |\n * 3e | RETURNDATACOPY | success | [0..rds): returndata |\n * |\n * 60 0x29 | PUSH1 0x29 | 0x29 success | [0..rds): returndata |\n * 57 | JUMPI | | [0..rds): returndata |\n * |\n * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | rds | [0..rds): returndata |\n * 5f | PUSH0 | 0 rds | [0..rds): returndata |\n * fd | REVERT | | [0..rds): returndata |\n * |\n * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 5b | JUMPDEST | | [0..rds): returndata |\n * 3d | RETURNDATASIZE | rds | [0..rds): returndata |\n * 5f | PUSH0 | 0 rds | [0..rds): returndata |\n * f3 | RETURN | | [0..rds): returndata |\n * --------------------------------------------------------------------------+\n */\n\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\n mstore(0x14, implementation) // 20\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\n instance := create(0, 0x0e, 0x36)\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x24, 0)\n }\n }\n\n /// @dev Deploys a deterministic PUSH0 clone of `implementation` with `salt`.\n function cloneDeterministic_PUSH0(address implementation, bytes32 salt)\n internal\n returns (address instance)\n {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\n mstore(0x14, implementation) // 20\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\n instance := create2(0, 0x0e, 0x36, salt)\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x24, 0)\n }\n }\n\n /// @dev Returns the initialization code hash of the PUSH0 clone of `implementation`.\n /// Used for mining vanity addresses with create2crunch.\n function initCodeHash_PUSH0(address implementation) internal pure returns (bytes32 hash) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\n mstore(0x14, implementation) // 20\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\n hash := keccak256(0x0e, 0x36)\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x24, 0)\n }\n }\n\n /// @dev Returns the address of the deterministic PUSH0 clone of `implementation`,\n /// with `salt` by `deployer`.\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\n function predictDeterministicAddress_PUSH0(\n address implementation,\n bytes32 salt,\n address deployer\n ) internal pure returns (address predicted) {\n bytes32 hash = initCodeHash_PUSH0(implementation);\n predicted = predictDeterministicAddress(hash, salt, deployer);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CLONES WITH IMMUTABLE ARGS OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Deploys a minimal proxy with `implementation`,\n /// using immutable arguments encoded in `data`.\n ///\n /// Note: This implementation of CWIA differs from the original implementation.\n /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.\n function clone(address implementation, bytes memory data) internal returns (address instance) {\n assembly {\n // Compute the boundaries of the data and cache the memory slots around it.\n let mBefore3 := mload(sub(data, 0x60))\n let mBefore2 := mload(sub(data, 0x40))\n let mBefore1 := mload(sub(data, 0x20))\n let dataLength := mload(data)\n let dataEnd := add(add(data, 0x20), dataLength)\n let mAfter1 := mload(dataEnd)\n\n // +2 bytes for telling how much data there is appended to the call.\n let extraLength := add(dataLength, 2)\n // The `creationSize` is `extraLength + 108`\n // The `runSize` is `creationSize - 10`.\n\n /**\n * ---------------------------------------------------------------------------------------------------+\n * CREATION (10 bytes) |\n * ---------------------------------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * ---------------------------------------------------------------------------------------------------|\n * 61 runSize | PUSH2 runSize | r | |\n * 3d | RETURNDATASIZE | 0 r | |\n * 81 | DUP2 | r 0 r | |\n * 60 offset | PUSH1 offset | o r 0 r | |\n * 3d | RETURNDATASIZE | 0 o r 0 r | |\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\n * f3 | RETURN | | [0..runSize): runtime code |\n * ---------------------------------------------------------------------------------------------------|\n * RUNTIME (98 bytes + extraLength) |\n * ---------------------------------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * ---------------------------------------------------------------------------------------------------|\n * |\n * ::: if no calldata, emit event & return w/o `DELEGATECALL` ::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds | |\n * 60 0x2c | PUSH1 0x2c | 0x2c cds | |\n * 57 | JUMPI | | |\n * 34 | CALLVALUE | cv | |\n * 3d | RETURNDATASIZE | 0 cv | |\n * 52 | MSTORE | | [0..0x20): callvalue |\n * 7f sig | PUSH32 0x9e.. | sig | [0..0x20): callvalue |\n * 59 | MSIZE | 0x20 sig | [0..0x20): callvalue |\n * 3d | RETURNDATASIZE | 0 0x20 sig | [0..0x20): callvalue |\n * a1 | LOG1 | | [0..0x20): callvalue |\n * 00 | STOP | | [0..0x20): callvalue |\n * 5b | JUMPDEST | | |\n * |\n * ::: copy calldata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds | |\n * 3d | RETURNDATASIZE | 0 cds | |\n * 3d | RETURNDATASIZE | 0 0 cds | |\n * 37 | CALLDATACOPY | | [0..cds): calldata |\n * |\n * ::: keep some values in stack :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | 0 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | 0 0 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | 0 0 0 0 | [0..cds): calldata |\n * 61 extra | PUSH2 extra | e 0 0 0 0 | [0..cds): calldata |\n * |\n * ::: copy extra data to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 80 | DUP1 | e e 0 0 0 0 | [0..cds): calldata |\n * 60 0x62 | PUSH1 0x62 | 0x62 e e 0 0 0 0 | [0..cds): calldata |\n * 36 | CALLDATASIZE | cds 0x62 e e 0 0 0 0 | [0..cds): calldata |\n * 39 | CODECOPY | e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * |\n * ::: delegate call to the implementation contract ::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 01 | ADD | cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 3d | RETURNDATASIZE | 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 73 addr | PUSH20 addr | addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 5a | GAS | gas addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * |\n * ::: copy return data to memory ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData |\n * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData |\n * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata |\n * |\n * 60 0x60 | PUSH1 0x60 | 0x60 success 0 rds | [0..rds): returndata |\n * 57 | JUMPI | 0 rds | [0..rds): returndata |\n * |\n * ::: revert ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * fd | REVERT | | [0..rds): returndata |\n * |\n * ::: return ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 5b | JUMPDEST | 0 rds | [0..rds): returndata |\n * f3 | RETURN | | [0..rds): returndata |\n * ---------------------------------------------------------------------------------------------------+\n */\n // Write the bytecode before the data.\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\n // Write the address of the implementation.\n mstore(sub(data, 0x0d), implementation)\n // Write the rest of the bytecode.\n mstore(\n sub(data, 0x21),\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\n )\n // `keccak256(\"ReceiveETH(uint256)\")`\n mstore(\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\n )\n mstore(\n // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.\n // The actual EVM limit may be smaller and may change over time.\n sub(data, add(0x59, lt(extraLength, 0xff9e))),\n or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)\n )\n mstore(dataEnd, shl(0xf0, extraLength))\n\n // Create the instance.\n instance := create(0, sub(data, 0x4c), add(extraLength, 0x6c))\n\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n\n // Restore the overwritten memory surrounding `data`.\n mstore(dataEnd, mAfter1)\n mstore(data, dataLength)\n mstore(sub(data, 0x20), mBefore1)\n mstore(sub(data, 0x40), mBefore2)\n mstore(sub(data, 0x60), mBefore3)\n }\n }\n\n /// @dev Deploys a deterministic clone of `implementation`,\n /// using immutable arguments encoded in `data`, with `salt`.\n ///\n /// Note: This implementation of CWIA differs from the original implementation.\n /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.\n function cloneDeterministic(address implementation, bytes memory data, bytes32 salt)\n internal\n returns (address instance)\n {\n assembly {\n // Compute the boundaries of the data and cache the memory slots around it.\n let mBefore3 := mload(sub(data, 0x60))\n let mBefore2 := mload(sub(data, 0x40))\n let mBefore1 := mload(sub(data, 0x20))\n let dataLength := mload(data)\n let dataEnd := add(add(data, 0x20), dataLength)\n let mAfter1 := mload(dataEnd)\n\n // +2 bytes for telling how much data there is appended to the call.\n let extraLength := add(dataLength, 2)\n\n // Write the bytecode before the data.\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\n // Write the address of the implementation.\n mstore(sub(data, 0x0d), implementation)\n // Write the rest of the bytecode.\n mstore(\n sub(data, 0x21),\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\n )\n // `keccak256(\"ReceiveETH(uint256)\")`\n mstore(\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\n )\n mstore(\n // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.\n // The actual EVM limit may be smaller and may change over time.\n sub(data, add(0x59, lt(extraLength, 0xff9e))),\n or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)\n )\n mstore(dataEnd, shl(0xf0, extraLength))\n\n // Create the instance.\n instance := create2(0, sub(data, 0x4c), add(extraLength, 0x6c), salt)\n\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n\n // Restore the overwritten memory surrounding `data`.\n mstore(dataEnd, mAfter1)\n mstore(data, dataLength)\n mstore(sub(data, 0x20), mBefore1)\n mstore(sub(data, 0x40), mBefore2)\n mstore(sub(data, 0x60), mBefore3)\n }\n }\n\n /// @dev Returns the initialization code hash of the clone of `implementation`\n /// using immutable arguments encoded in `data`.\n /// Used for mining vanity addresses with create2crunch.\n function initCodeHash(address implementation, bytes memory data)\n internal\n pure\n returns (bytes32 hash)\n {\n assembly {\n // Compute the boundaries of the data and cache the memory slots around it.\n let mBefore3 := mload(sub(data, 0x60))\n let mBefore2 := mload(sub(data, 0x40))\n let mBefore1 := mload(sub(data, 0x20))\n let dataLength := mload(data)\n let dataEnd := add(add(data, 0x20), dataLength)\n let mAfter1 := mload(dataEnd)\n\n // Do a out-of-gas revert if `dataLength` is too big. 0xffff - 0x02 - 0x62 = 0xff9b.\n // The actual EVM limit may be smaller and may change over time.\n returndatacopy(returndatasize(), returndatasize(), gt(dataLength, 0xff9b))\n\n // +2 bytes for telling how much data there is appended to the call.\n let extraLength := add(dataLength, 2)\n\n // Write the bytecode before the data.\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\n // Write the address of the implementation.\n mstore(sub(data, 0x0d), implementation)\n // Write the rest of the bytecode.\n mstore(\n sub(data, 0x21),\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\n )\n // `keccak256(\"ReceiveETH(uint256)\")`\n mstore(\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\n )\n mstore(\n sub(data, 0x5a),\n or(shl(0x78, add(extraLength, 0x62)), 0x6100003d81600a3d39f336602c57343d527f)\n )\n mstore(dataEnd, shl(0xf0, extraLength))\n\n // Compute and store the bytecode hash.\n hash := keccak256(sub(data, 0x4c), add(extraLength, 0x6c))\n\n // Restore the overwritten memory surrounding `data`.\n mstore(dataEnd, mAfter1)\n mstore(data, dataLength)\n mstore(sub(data, 0x20), mBefore1)\n mstore(sub(data, 0x40), mBefore2)\n mstore(sub(data, 0x60), mBefore3)\n }\n }\n\n /// @dev Returns the address of the deterministic clone of\n /// `implementation` using immutable arguments encoded in `data`, with `salt`, by `deployer`.\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\n function predictDeterministicAddress(\n address implementation,\n bytes memory data,\n bytes32 salt,\n address deployer\n ) internal pure returns (address predicted) {\n bytes32 hash = initCodeHash(implementation, data);\n predicted = predictDeterministicAddress(hash, salt, deployer);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* OTHER OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns the address when a contract with initialization code hash,\n /// `hash`, is deployed with `salt`, by `deployer`.\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\n function predictDeterministicAddress(bytes32 hash, bytes32 salt, address deployer)\n internal\n pure\n returns (address predicted)\n {\n /// @solidity memory-safe-assembly\n assembly {\n // Compute and store the bytecode hash.\n mstore8(0x00, 0xff) // Write the prefix.\n mstore(0x35, hash)\n mstore(0x01, shl(96, deployer))\n mstore(0x15, salt)\n predicted := keccak256(0x00, 0x55)\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x35, 0)\n }\n }\n\n /// @dev Reverts if `salt` does not start with either the zero address or the caller.\n function checkStartsWithCaller(bytes32 salt) internal view {\n /// @solidity memory-safe-assembly\n assembly {\n // If the salt does not start with the zero address or the caller.\n if iszero(or(iszero(shr(96, salt)), eq(caller(), shr(96, salt)))) {\n // Store the function selector of `SaltDoesNotStartWithCaller()`.\n mstore(0x00, 0x2f634836)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n }\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000 + }, + "evmVersion": "paris", + "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/deployments/muster_production/.chainId b/deployments/muster_production/.chainId new file mode 100644 index 0000000..9592e7f --- /dev/null +++ b/deployments/muster_production/.chainId @@ -0,0 +1 @@ +4078 \ No newline at end of file diff --git a/deployments/muster_production/P256Signer.json b/deployments/muster_production/P256Signer.json new file mode 100644 index 0000000..15ad20c --- /dev/null +++ b/deployments/muster_production/P256Signer.json @@ -0,0 +1,275 @@ +{ + "address": "0x71558e9Ac314B17Eb665441aFF60914EAE391712", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AlreadyInitialized", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidAuthenticatorData", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidClientData", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidHash", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_hash", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "x", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "y", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x3fd175fc1a0effa3f99e3dd301b575109e0a73dca8464e1fc736dedd54d3ba53", + "receipt": { + "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", + "from": "0xda677C8877E49Dfc31dC7e92fA7615F4Fb4047D7", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "1932511", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xb15361eb6f79c1374bf90ce227343570fc0f9befc9c066279f03d88f166013e8", + "transactionHash": "0x3fd175fc1a0effa3f99e3dd301b575109e0a73dca8464e1fc736dedd54d3ba53", + "logs": [], + "blockNumber": 116, + "cumulativeGasUsed": "1932511", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "c99418166b2fc7a84fdc0f742530dbd8", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y_\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_hash\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"x\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"y\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is the implementation. It is meant to be used through proxy clone.\",\"kind\":\"dev\",\"methods\":{\"initialize(uint256,uint256)\":{\"details\":\"This function is only callable once and needs to be called immediately after deployment by the factory in the same transaction.\",\"params\":{\"x_\":\"The x coordinate of the public key\",\"y_\":\"The y coordinate of the public key\"}},\"isValidSignature(bytes,bytes)\":{\"details\":\"This is the old version of the function of EIP-1271 using bytes memory instead of bytes32\",\"params\":{\"_hash\":\"The hash of the data signed\",\"_signature\":\"The signature\"},\"returns\":{\"_0\":\"The EIP-1271 magic value\"}},\"isValidSignature(bytes32,bytes)\":{\"params\":{\"_hash\":\"The hash of the data signed\",\"_signature\":\"The signature\"},\"returns\":{\"_0\":\"The EIP-1271 magic value\"}}},\"title\":\"P256Signer\",\"version\":1},\"userdoc\":{\"errors\":{\"AlreadyInitialized()\":[{\"notice\":\"Error message when the contract is already initialized\"}],\"InvalidHash()\":[{\"notice\":\"Error message when the hash is invalid\"}],\"InvalidSignature()\":[{\"notice\":\"Error message when the signature is invalid\"}]},\"kind\":\"user\",\"methods\":{\"initialized()\":{\"notice\":\"Whether the contract has been initialized\"},\"isValidSignature(bytes,bytes)\":{\"notice\":\"Verifies that the signer is the owner of the secp256r1 public key.\"},\"isValidSignature(bytes32,bytes)\":{\"notice\":\"Verifies that the signer is the owner of the secp256r1 public key.\"},\"x()\":{\"notice\":\"The x coordinate of the secp256r1 public key\"},\"y()\":{\"notice\":\"The y coordinate of the secp256r1 public key\"}},\"notice\":\"A contract used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/P256Signer.sol\":\"P256Signer\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\nimport {FCL_ecdsa} from \\\"./FCL_ecdsa.sol\\\";\\n\\nimport {FCL_ecdsa_utils} from \\\"./FCL_ecdsa_utils.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n return checkSignature(authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs, Q[0], Q[1]);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 Qx,\\n uint256 Qy\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_ecdsa_utils.ecdsa_verify(message, rs, Qx, Qy);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_ecdsa.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xc2811ef6e17ea1d5509a3d3f7d5af5e56583347b36093d05530425d7c1316dd6\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_ecdsa.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_ecdsa.sol\\n///*\\n///*\\n///* DESCRIPTION: ecdsa verification implementation\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\n\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\n\\n\\nlibrary FCL_ecdsa {\\n // Set parameters for curve sec256r1.public\\n //curve order (number of points)\\n uint256 constant n = FCL_Elliptic_ZZ.n;\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key, no calldata version\\n */\\n function ecdsa_verify(bytes32 message, uint256 r, uint256 s, uint256 Qx, uint256 Qy) internal view returns (bool){\\n\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return false;\\n }\\n \\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\\n uint256 x1;\\n\\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\\n\\n x1= addmod(x1, n-r,n );\\n \\n return x1 == 0;\\n }\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\\n {\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return address(0);\\n }\\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256 r, uint256 s, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n \\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n X= addmod(X, n-r,n );\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n X= addmod(X, n-r,n );\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n}\\n\",\"keccak256\":\"0x679d2e9a655cd7e156a0cfc24de0aca88d4e0b34a8e0dfe6a599f23af092f5a2\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_ecdsa_utils.sol\":{\"content\":\"\\n//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_ecdsa.sol\\n///*\\n///*\\n///* DESCRIPTION: ecdsa verification implementation\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\n\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\n\\n\\nlibrary FCL_ecdsa_utils {\\n // Set parameters for curve sec256r1.public\\n //curve order (number of points)\\n uint256 constant n = FCL_Elliptic_ZZ.n;\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256 Qx, uint256 Qy) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return false;\\n }\\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\\n uint256 x1;\\n\\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\\n x1= addmod(x1, n-r,n );\\n \\n \\n return x1 == 0;\\n }\\n\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n return ecdsa_verify(message, rs, Q[0], Q[1]);\\n }\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\\n {\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return address(0);\\n }\\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) internal view returns(uint256 r, uint256 s)\\n {\\n r=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, FCL_Elliptic_ZZ.n); \\n s=mulmod(FCL_Elliptic_ZZ.FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n //ecdsa key derivation\\n //kpriv is private key return (x,y) coordinates of associated Pubkey\\n function ecdsa_derivKpub(uint256 kpriv) internal view returns(uint256 x, uint256 y)\\n {\\n \\n x=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, kpriv, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n y=FCL_Elliptic_ZZ.ec_Decompress(x, 1);\\n \\n if (FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(x, y, kpriv, FCL_Elliptic_ZZ.n - 1) != 0) //extract correct y value\\n {\\n y=FCL_Elliptic_ZZ.p-y;\\n } \\n\\n }\\n \\n //precomputations for 8 dimensional trick\\n function Precalc_8dim( uint256 Qx, uint256 Qy) internal view returns( uint[2][256] memory Prec)\\n {\\n \\n uint[2][8] memory Pow64_PQ; //store P, 64P, 128P, 192P, Q, 64Q, 128Q, 192Q\\n \\n //the trivial private keys 1 and -1 are forbidden\\n if(Qx==FCL_Elliptic_ZZ.gx)\\n {\\n revert();\\n }\\n Pow64_PQ[0][0]=FCL_Elliptic_ZZ.gx;\\n Pow64_PQ[0][1]=FCL_Elliptic_ZZ.gy;\\n \\n Pow64_PQ[4][0]=Qx;\\n Pow64_PQ[4][1]=Qy;\\n \\n /* raise to multiplication by 64 by 6 consecutive doubling*/\\n for(uint j=1;j<4;j++){\\n uint256 x;\\n uint256 y;\\n uint256 zz;\\n uint256 zzz;\\n \\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j-1][0], Pow64_PQ[j-1][1], 1, 1);\\n \\t(Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n (x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+3][0], Pow64_PQ[j+3][1], 1, 1);\\n \\t(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n\\n \\tfor(uint i=0;i<63;i++){\\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j][0], Pow64_PQ[j][1],1,1);\\n (Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1],1,1);\\n (Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n \\t}\\n }\\n \\n /* neutral point */\\n Prec[0][0]=0;\\n Prec[0][1]=0;\\n \\n \\t\\n for(uint i=1;i<256;i++)\\n { \\n Prec[i][0]=0;\\n Prec[i][1]=0;\\n \\n for(uint j=0;j<8;j++)\\n {\\n \\tif( (i&(1<=0.8.19 <0.9.0;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if ( ((0 == x)&&( 0 == y)) || x == p || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates. Deal with P=Q\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n if((x0==x1)&&(y0==y1)) {\\n (x0, y0, zz0, zzz0) = ecZZ_Dbl(x0, y0,1,1);\\n }\\n else{\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n }\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); \\n if((H0==0)&&(H1==0))//handling Q=-G\\n {\\n scalar_u=addmod(scalar_u, n-scalar_v, n);\\n scalar_v=0;\\n\\n }\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := mulmod(addmod(X, zz, p), addmod(X, sub(p, zz), p), p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M=3*(X-ZZ)(X+ZZ)\\n\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n\\n\\n} //EOF\\n\",\"keccak256\":\"0xa09802f3ca65d654d56260f40db449f9fbefbadb64429772e6f133ad6370eab9\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/P256Signer.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title P256Signer\\n/// @notice A contract used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This contract is the implementation. It is meant to be used through\\n/// proxy clone.\\ncontract P256Signer {\\n /// @notice The EIP-1271 magic value\\n bytes4 internal constant EIP1271_MAGICVALUE = 0x1626ba7e;\\n\\n /// @notice The old EIP-1271 magic value\\n bytes4 internal constant OLD_EIP1271_MAGICVALUE = 0x20c13b0b;\\n\\n /// @notice Whether the contract has been initialized\\n bool public initialized;\\n\\n /// @notice The x coordinate of the secp256r1 public key\\n uint256 public x;\\n\\n /// @notice The y coordinate of the secp256r1 public key\\n uint256 public y;\\n\\n /// @notice Error message when the signature is invalid\\n error InvalidSignature();\\n\\n /// @notice Error message when the hash is invalid\\n error InvalidHash();\\n\\n /// @notice Error message when the contract is already initialized\\n error AlreadyInitialized();\\n\\n constructor() {\\n initialized = true;\\n }\\n\\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\\n /// @param _hash The hash of the data signed\\n /// @param _signature The signature\\n /// @return The EIP-1271 magic value\\n function isValidSignature(bytes32 _hash, bytes calldata _signature) public view returns (bytes4) {\\n _validate(abi.encode(_hash), _signature);\\n return EIP1271_MAGICVALUE;\\n }\\n\\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\\n /// @dev This is the old version of the function of EIP-1271 using bytes\\n /// memory instead of bytes32\\n /// @param _hash The hash of the data signed\\n /// @param _signature The signature\\n /// @return The EIP-1271 magic value\\n function isValidSignature(bytes memory _hash, bytes calldata _signature) public view returns (bytes4) {\\n _validate(_hash, _signature);\\n return OLD_EIP1271_MAGICVALUE;\\n }\\n\\n struct SignatureLayout {\\n bytes authenticatorData;\\n bytes clientData;\\n uint256 challengeOffset;\\n uint256[2] rs;\\n }\\n\\n /// @notice Validates the signature\\n /// @param data The data signed\\n /// @param _signature The signature\\n function _validate(bytes memory data, bytes calldata _signature) private view {\\n bytes32 _hash = keccak256(data);\\n SignatureLayout calldata signaturePointer;\\n // This code should precalculate the offsets of variables as defined in the layout\\n // Calldata variables are represented as offsets, and, I think, length for dynamic types\\n // If the calldata is malformed (e.g., shorter than expected), this will revert with an out of bounds error\\n assembly {\\n signaturePointer := _signature.offset\\n }\\n\\n bool valid = FCL_WebAuthn.checkSignature(\\n signaturePointer.authenticatorData,\\n 0x01,\\n signaturePointer.clientData,\\n _hash,\\n signaturePointer.challengeOffset,\\n signaturePointer.rs,\\n x,\\n y\\n );\\n\\n if (!valid) revert InvalidSignature();\\n }\\n\\n /// @dev This function is only callable once and needs to be called immediately\\n /// after deployment by the factory in the same transaction.\\n /// @param x_ The x coordinate of the public key\\n /// @param y_ The y coordinate of the public key\\n function initialize(uint256 x_, uint256 y_) external {\\n if (initialized) revert AlreadyInitialized();\\n initialized = true;\\n x = x_;\\n y = y_;\\n }\\n}\\n\",\"keccak256\":\"0xfc1b006adb6ace0364918015a1aa64439374f813383bcc71290f6b37b66641e5\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506000805460ff1916600117905561204b8061002d6000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c806320c13b0b1161005057806320c13b0b146100f4578063a56dfe4a14610107578063e4a301161461011057600080fd5b80630c55699c14610077578063158ef93e146100935780631626ba7e146100b0575b600080fd5b61008060015481565b6040519081526020015b60405180910390f35b6000546100a09060ff1681565b604051901515815260200161008a565b6100c36100be366004611cb9565b610125565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161008a565b6100c3610102366004611d34565b61017c565b61008060025481565b61012361011e366004611e20565b6101b2565b005b60006101538460405160200161013d91815260200190565b6040516020818303038152906040528484610226565b507f1626ba7e000000000000000000000000000000000000000000000000000000009392505050565b6000610189848484610226565b507f20c13b0b000000000000000000000000000000000000000000000000000000009392505050565b60005460ff16156101ef576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591909155600255565b8251602084012082600061028061023d8380611e42565b7f010000000000000000000000000000000000000000000000000000000000000061026b6020870187611e42565b888860400135896060016001546002546102c1565b9050806102b9576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000806102d48c8c8c8c8c8c8c8c6102f5565b905060006102e482878787610598565b9d9c50505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a602081811061032e5761032e611ea7565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610392576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103be856040516020016103aa91815260200190565b6040516020818303038152906040526106f7565b90506000815167ffffffffffffffff8111156103dc576103dc611d05565b6040519080825280601f01601f191660200182016040528015610406576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016104309190611ed6565b604051602081830303815290604052805190602001201461047d576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061048f9050896020611f34565b67ffffffffffffffff8111156104a7576104a7611d05565b6040519080825280601f01601f1916602001820160405280156104d1576020820181803683370190505b509050888a60208301376000600288886040516104ef929190611f47565b602060405180830381855afa15801561050c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061052f9190611f57565b90508060208b018301526002826040516105499190611ed6565b602060405180830381855afa158015610566573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906105899190611f57565b9b9a5050505050505050505050565b6000833560208501358115806105ce57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b806105d7575080155b8061060257507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b15610612576000925050506106ef565b61061c8585610866565b61062b576000925050506106ef565b6000610636826109e0565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828a09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518386099050600061069689898585610a64565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325516106e3877fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611f70565b82081596505050505050505b949350505050565b6060815160000361071657505060408051602081019091526000815290565b6000604051806060016040528060408152602001611fd660409139905060006003845160026107459190611f34565b61074f9190611f83565b61075a906004611fbe565b67ffffffffffffffff81111561077257610772611d05565b6040519080825280601f01601f19166020018201604052801561079c576020820181803683370190505b509050600182016020820185865187015b80821015610808576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506107ad565b5050600386510660018114610824576002811461082f57610836565b600282039150610836565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158015610874575081155b8061089e57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806108c857507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156108d5575060006109da565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa610a5d57600080fd5b5192915050565b600080808060ff818088158015610a79575087155b15610a8d57600096505050505050506106ef565b610ad97f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d611561565b909250905081158015610aea575080155b15610b3c577fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038a089850600097505b600189841c16600189851c1660011b015b80610b6f5760018403935060018a851c1660018a861c1660011b019050610b4d565b50600189841c16600189851c1660011b01955060018603610bd1577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610be0578a96508993505b60038603610bef578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11156114b1577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610eda57877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff039750505050506114a6565b60018103610f29577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610f38578e93508d92505b60038103610f47578593508492505b89610f6057509198506001975087965094506114a69050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061129f578361129f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f080990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8160030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a860999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a87098508985050505050506114a6565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610bfe565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61152c57600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099c9b505050505050505050505050565b6000808080866115785785859350935050506115e6565b8461158a5787879350935050506115e6565b858814801561159857508487145b156115b9576115aa88886001806115ef565b929a50909850925090506115d3565b6115c888886001808a8a611879565b929a50909850925090505b6115df88888484611b3e565b9350935050505b94509492505050565b6000806000807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8760020993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82890990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff888b087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038c080960030995507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8889090893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038308870997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85840990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808885097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff0389089250945094509450949050565b6000806000808860000361189857508492508391506001905080611b31565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b6000806000611b4c84611bf3565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa610a5d57600080fd5b60008083601f840112611c8257600080fd5b50813567ffffffffffffffff811115611c9a57600080fd5b602083019150836020828501011115611cb257600080fd5b9250929050565b600080600060408486031215611cce57600080fd5b83359250602084013567ffffffffffffffff811115611cec57600080fd5b611cf886828701611c70565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060408486031215611d4957600080fd5b833567ffffffffffffffff80821115611d6157600080fd5b818601915086601f830112611d7557600080fd5b813581811115611d8757611d87611d05565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611dcd57611dcd611d05565b81604052828152896020848701011115611de657600080fd5b826020860160208301376000602084830101528097505050506020860135915080821115611e1357600080fd5b50611cf886828701611c70565b60008060408385031215611e3357600080fd5b50508035926020909101359150565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e7757600080fd5b83018035915067ffffffffffffffff821115611e9257600080fd5b602001915036819003821315611cb257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ef75760208186018101518583015201611edd565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156109da576109da611f05565b8183823760009101908152919050565b600060208284031215611f6957600080fd5b5051919050565b818103818111156109da576109da611f05565b600082611fb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820281158282048414176109da576109da611f0556fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa264697066735822122010b19bcb302b393f0f07ede9ec3810838497a4931544263dc93726e735cb3b0e64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c806320c13b0b1161005057806320c13b0b146100f4578063a56dfe4a14610107578063e4a301161461011057600080fd5b80630c55699c14610077578063158ef93e146100935780631626ba7e146100b0575b600080fd5b61008060015481565b6040519081526020015b60405180910390f35b6000546100a09060ff1681565b604051901515815260200161008a565b6100c36100be366004611cb9565b610125565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161008a565b6100c3610102366004611d34565b61017c565b61008060025481565b61012361011e366004611e20565b6101b2565b005b60006101538460405160200161013d91815260200190565b6040516020818303038152906040528484610226565b507f1626ba7e000000000000000000000000000000000000000000000000000000009392505050565b6000610189848484610226565b507f20c13b0b000000000000000000000000000000000000000000000000000000009392505050565b60005460ff16156101ef576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591909155600255565b8251602084012082600061028061023d8380611e42565b7f010000000000000000000000000000000000000000000000000000000000000061026b6020870187611e42565b888860400135896060016001546002546102c1565b9050806102b9576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000806102d48c8c8c8c8c8c8c8c6102f5565b905060006102e482878787610598565b9d9c50505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a602081811061032e5761032e611ea7565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610392576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103be856040516020016103aa91815260200190565b6040516020818303038152906040526106f7565b90506000815167ffffffffffffffff8111156103dc576103dc611d05565b6040519080825280601f01601f191660200182016040528015610406576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016104309190611ed6565b604051602081830303815290604052805190602001201461047d576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061048f9050896020611f34565b67ffffffffffffffff8111156104a7576104a7611d05565b6040519080825280601f01601f1916602001820160405280156104d1576020820181803683370190505b509050888a60208301376000600288886040516104ef929190611f47565b602060405180830381855afa15801561050c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061052f9190611f57565b90508060208b018301526002826040516105499190611ed6565b602060405180830381855afa158015610566573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906105899190611f57565b9b9a5050505050505050505050565b6000833560208501358115806105ce57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b806105d7575080155b8061060257507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b15610612576000925050506106ef565b61061c8585610866565b61062b576000925050506106ef565b6000610636826109e0565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828a09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518386099050600061069689898585610a64565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325516106e3877fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611f70565b82081596505050505050505b949350505050565b6060815160000361071657505060408051602081019091526000815290565b6000604051806060016040528060408152602001611fd660409139905060006003845160026107459190611f34565b61074f9190611f83565b61075a906004611fbe565b67ffffffffffffffff81111561077257610772611d05565b6040519080825280601f01601f19166020018201604052801561079c576020820181803683370190505b509050600182016020820185865187015b80821015610808576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506107ad565b5050600386510660018114610824576002811461082f57610836565b600282039150610836565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158015610874575081155b8061089e57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806108c857507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156108d5575060006109da565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa610a5d57600080fd5b5192915050565b600080808060ff818088158015610a79575087155b15610a8d57600096505050505050506106ef565b610ad97f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d611561565b909250905081158015610aea575080155b15610b3c577fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038a089850600097505b600189841c16600189851c1660011b015b80610b6f5760018403935060018a851c1660018a861c1660011b019050610b4d565b50600189841c16600189851c1660011b01955060018603610bd1577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610be0578a96508993505b60038603610bef578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11156114b1577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610eda57877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff039750505050506114a6565b60018103610f29577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610f38578e93508d92505b60038103610f47578593508492505b89610f6057509198506001975087965094506114a69050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061129f578361129f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f080990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8160030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a860999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a87098508985050505050506114a6565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610bfe565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61152c57600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099c9b505050505050505050505050565b6000808080866115785785859350935050506115e6565b8461158a5787879350935050506115e6565b858814801561159857508487145b156115b9576115aa88886001806115ef565b929a50909850925090506115d3565b6115c888886001808a8a611879565b929a50909850925090505b6115df88888484611b3e565b9350935050505b94509492505050565b6000806000807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8760020993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82890990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff888b087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038c080960030995507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8889090893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038308870997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85840990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808885097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff0389089250945094509450949050565b6000806000808860000361189857508492508391506001905080611b31565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b6000806000611b4c84611bf3565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa610a5d57600080fd5b60008083601f840112611c8257600080fd5b50813567ffffffffffffffff811115611c9a57600080fd5b602083019150836020828501011115611cb257600080fd5b9250929050565b600080600060408486031215611cce57600080fd5b83359250602084013567ffffffffffffffff811115611cec57600080fd5b611cf886828701611c70565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060408486031215611d4957600080fd5b833567ffffffffffffffff80821115611d6157600080fd5b818601915086601f830112611d7557600080fd5b813581811115611d8757611d87611d05565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611dcd57611dcd611d05565b81604052828152896020848701011115611de657600080fd5b826020860160208301376000602084830101528097505050506020860135915080821115611e1357600080fd5b50611cf886828701611c70565b60008060408385031215611e3357600080fd5b50508035926020909101359150565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e7757600080fd5b83018035915067ffffffffffffffff821115611e9257600080fd5b602001915036819003821315611cb257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ef75760208186018101518583015201611edd565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156109da576109da611f05565b8183823760009101908152919050565b600060208284031215611f6957600080fd5b5051919050565b818103818111156109da576109da611f05565b600082611fb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820281158282048414176109da576109da611f0556fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa264697066735822122010b19bcb302b393f0f07ede9ec3810838497a4931544263dc93726e735cb3b0e64736f6c63430008140033", + "devdoc": { + "details": "This contract is the implementation. It is meant to be used through proxy clone.", + "kind": "dev", + "methods": { + "initialize(uint256,uint256)": { + "details": "This function is only callable once and needs to be called immediately after deployment by the factory in the same transaction.", + "params": { + "x_": "The x coordinate of the public key", + "y_": "The y coordinate of the public key" + } + }, + "isValidSignature(bytes,bytes)": { + "details": "This is the old version of the function of EIP-1271 using bytes memory instead of bytes32", + "params": { + "_hash": "The hash of the data signed", + "_signature": "The signature" + }, + "returns": { + "_0": "The EIP-1271 magic value" + } + }, + "isValidSignature(bytes32,bytes)": { + "params": { + "_hash": "The hash of the data signed", + "_signature": "The signature" + }, + "returns": { + "_0": "The EIP-1271 magic value" + } + } + }, + "title": "P256Signer", + "version": 1 + }, + "userdoc": { + "errors": { + "AlreadyInitialized()": [ + { + "notice": "Error message when the contract is already initialized" + } + ], + "InvalidHash()": [ + { + "notice": "Error message when the hash is invalid" + } + ], + "InvalidSignature()": [ + { + "notice": "Error message when the signature is invalid" + } + ] + }, + "kind": "user", + "methods": { + "initialized()": { + "notice": "Whether the contract has been initialized" + }, + "isValidSignature(bytes,bytes)": { + "notice": "Verifies that the signer is the owner of the secp256r1 public key." + }, + "isValidSignature(bytes32,bytes)": { + "notice": "Verifies that the signer is the owner of the secp256r1 public key." + }, + "x()": { + "notice": "The x coordinate of the secp256r1 public key" + }, + "y()": { + "notice": "The y coordinate of the secp256r1 public key" + } + }, + "notice": "A contract used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 2859, + "contract": "contracts/P256Signer.sol:P256Signer", + "label": "initialized", + "offset": 0, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 2862, + "contract": "contracts/P256Signer.sol:P256Signer", + "label": "x", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 2865, + "contract": "contracts/P256Signer.sol:P256Signer", + "label": "y", + "offset": 0, + "slot": "2", + "type": "t_uint256" + } + ], + "types": { + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/deployments/muster_production/P256SignerFactory.json b/deployments/muster_production/P256SignerFactory.json new file mode 100644 index 0000000..dac7228 --- /dev/null +++ b/deployments/muster_production/P256SignerFactory.json @@ -0,0 +1,137 @@ +{ + "address": "0x73dA77F0f2daaa88b908413495d3D0e37458212e", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "y", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "NewSignerCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xf9b84b3e3f60e9c236cd622d169aa7bd4d2be1a609cd1a08fd6116b3745e4791", + "receipt": { + "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", + "from": "0xda677C8877E49Dfc31dC7e92fA7615F4Fb4047D7", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "218220", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xc9d85f009c78011ed0903ffe193e7428eab69cb6adbb88ec2cd8165d36a629f3", + "transactionHash": "0xf9b84b3e3f60e9c236cd622d169aa7bd4d2be1a609cd1a08fd6116b3745e4791", + "logs": [], + "blockNumber": 117, + "cumulativeGasUsed": "218220", + "status": 1, + "byzantium": true + }, + "args": [ + "0x71558e9Ac314B17Eb665441aFF60914EAE391712" + ], + "numDeployments": 1, + "solcInputHash": "c99418166b2fc7a84fdc0f742530dbd8", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"NewSignerCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"create(uint256,uint256)\":{\"params\":{\"x\":\"The x coordinate of the public key\",\"y\":\"The y coordinate of the public key\"}}},\"title\":\"P256SignerFactory\",\"version\":1},\"userdoc\":{\"events\":{\"NewSignerCreated(uint256,uint256,address)\":{\"notice\":\"Emitted when a new P256Signer proxy contract is created\"}},\"kind\":\"user\",\"methods\":{\"create(uint256,uint256)\":{\"notice\":\"Creates a new P256Signer proxy contract\"},\"implementation()\":{\"notice\":\"The implementation address of the P256Signer contract\"}},\"notice\":\"Factory contract for creating proxies for P256Signer\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/P256SignerFactory.sol\":\"P256SignerFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\nimport {FCL_ecdsa} from \\\"./FCL_ecdsa.sol\\\";\\n\\nimport {FCL_ecdsa_utils} from \\\"./FCL_ecdsa_utils.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n return checkSignature(authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs, Q[0], Q[1]);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 Qx,\\n uint256 Qy\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_ecdsa_utils.ecdsa_verify(message, rs, Qx, Qy);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_ecdsa.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xc2811ef6e17ea1d5509a3d3f7d5af5e56583347b36093d05530425d7c1316dd6\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_ecdsa.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_ecdsa.sol\\n///*\\n///*\\n///* DESCRIPTION: ecdsa verification implementation\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\n\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\n\\n\\nlibrary FCL_ecdsa {\\n // Set parameters for curve sec256r1.public\\n //curve order (number of points)\\n uint256 constant n = FCL_Elliptic_ZZ.n;\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key, no calldata version\\n */\\n function ecdsa_verify(bytes32 message, uint256 r, uint256 s, uint256 Qx, uint256 Qy) internal view returns (bool){\\n\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return false;\\n }\\n \\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\\n uint256 x1;\\n\\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\\n\\n x1= addmod(x1, n-r,n );\\n \\n return x1 == 0;\\n }\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\\n {\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return address(0);\\n }\\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256 r, uint256 s, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n \\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n X= addmod(X, n-r,n );\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n X= addmod(X, n-r,n );\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n}\\n\",\"keccak256\":\"0x679d2e9a655cd7e156a0cfc24de0aca88d4e0b34a8e0dfe6a599f23af092f5a2\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_ecdsa_utils.sol\":{\"content\":\"\\n//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_ecdsa.sol\\n///*\\n///*\\n///* DESCRIPTION: ecdsa verification implementation\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\n\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\n\\n\\nlibrary FCL_ecdsa_utils {\\n // Set parameters for curve sec256r1.public\\n //curve order (number of points)\\n uint256 constant n = FCL_Elliptic_ZZ.n;\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256 Qx, uint256 Qy) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return false;\\n }\\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\\n uint256 x1;\\n\\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\\n x1= addmod(x1, n-r,n );\\n \\n \\n return x1 == 0;\\n }\\n\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n return ecdsa_verify(message, rs, Q[0], Q[1]);\\n }\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\\n {\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return address(0);\\n }\\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) internal view returns(uint256 r, uint256 s)\\n {\\n r=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, FCL_Elliptic_ZZ.n); \\n s=mulmod(FCL_Elliptic_ZZ.FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n //ecdsa key derivation\\n //kpriv is private key return (x,y) coordinates of associated Pubkey\\n function ecdsa_derivKpub(uint256 kpriv) internal view returns(uint256 x, uint256 y)\\n {\\n \\n x=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, kpriv, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n y=FCL_Elliptic_ZZ.ec_Decompress(x, 1);\\n \\n if (FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(x, y, kpriv, FCL_Elliptic_ZZ.n - 1) != 0) //extract correct y value\\n {\\n y=FCL_Elliptic_ZZ.p-y;\\n } \\n\\n }\\n \\n //precomputations for 8 dimensional trick\\n function Precalc_8dim( uint256 Qx, uint256 Qy) internal view returns( uint[2][256] memory Prec)\\n {\\n \\n uint[2][8] memory Pow64_PQ; //store P, 64P, 128P, 192P, Q, 64Q, 128Q, 192Q\\n \\n //the trivial private keys 1 and -1 are forbidden\\n if(Qx==FCL_Elliptic_ZZ.gx)\\n {\\n revert();\\n }\\n Pow64_PQ[0][0]=FCL_Elliptic_ZZ.gx;\\n Pow64_PQ[0][1]=FCL_Elliptic_ZZ.gy;\\n \\n Pow64_PQ[4][0]=Qx;\\n Pow64_PQ[4][1]=Qy;\\n \\n /* raise to multiplication by 64 by 6 consecutive doubling*/\\n for(uint j=1;j<4;j++){\\n uint256 x;\\n uint256 y;\\n uint256 zz;\\n uint256 zzz;\\n \\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j-1][0], Pow64_PQ[j-1][1], 1, 1);\\n \\t(Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n (x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+3][0], Pow64_PQ[j+3][1], 1, 1);\\n \\t(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n\\n \\tfor(uint i=0;i<63;i++){\\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j][0], Pow64_PQ[j][1],1,1);\\n (Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1],1,1);\\n (Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n \\t}\\n }\\n \\n /* neutral point */\\n Prec[0][0]=0;\\n Prec[0][1]=0;\\n \\n \\t\\n for(uint i=1;i<256;i++)\\n { \\n Prec[i][0]=0;\\n Prec[i][1]=0;\\n \\n for(uint j=0;j<8;j++)\\n {\\n \\tif( (i&(1<=0.8.19 <0.9.0;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if ( ((0 == x)&&( 0 == y)) || x == p || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates. Deal with P=Q\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n if((x0==x1)&&(y0==y1)) {\\n (x0, y0, zz0, zzz0) = ecZZ_Dbl(x0, y0,1,1);\\n }\\n else{\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n }\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); \\n if((H0==0)&&(H1==0))//handling Q=-G\\n {\\n scalar_u=addmod(scalar_u, n-scalar_v, n);\\n scalar_v=0;\\n\\n }\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := mulmod(addmod(X, zz, p), addmod(X, sub(p, zz), p), p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M=3*(X-ZZ)(X+ZZ)\\n\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n\\n\\n} //EOF\\n\",\"keccak256\":\"0xa09802f3ca65d654d56260f40db449f9fbefbadb64429772e6f133ad6370eab9\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/P256Signer.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title P256Signer\\n/// @notice A contract used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This contract is the implementation. It is meant to be used through\\n/// proxy clone.\\ncontract P256Signer {\\n /// @notice The EIP-1271 magic value\\n bytes4 internal constant EIP1271_MAGICVALUE = 0x1626ba7e;\\n\\n /// @notice The old EIP-1271 magic value\\n bytes4 internal constant OLD_EIP1271_MAGICVALUE = 0x20c13b0b;\\n\\n /// @notice Whether the contract has been initialized\\n bool public initialized;\\n\\n /// @notice The x coordinate of the secp256r1 public key\\n uint256 public x;\\n\\n /// @notice The y coordinate of the secp256r1 public key\\n uint256 public y;\\n\\n /// @notice Error message when the signature is invalid\\n error InvalidSignature();\\n\\n /// @notice Error message when the hash is invalid\\n error InvalidHash();\\n\\n /// @notice Error message when the contract is already initialized\\n error AlreadyInitialized();\\n\\n constructor() {\\n initialized = true;\\n }\\n\\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\\n /// @param _hash The hash of the data signed\\n /// @param _signature The signature\\n /// @return The EIP-1271 magic value\\n function isValidSignature(bytes32 _hash, bytes calldata _signature) public view returns (bytes4) {\\n _validate(abi.encode(_hash), _signature);\\n return EIP1271_MAGICVALUE;\\n }\\n\\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\\n /// @dev This is the old version of the function of EIP-1271 using bytes\\n /// memory instead of bytes32\\n /// @param _hash The hash of the data signed\\n /// @param _signature The signature\\n /// @return The EIP-1271 magic value\\n function isValidSignature(bytes memory _hash, bytes calldata _signature) public view returns (bytes4) {\\n _validate(_hash, _signature);\\n return OLD_EIP1271_MAGICVALUE;\\n }\\n\\n struct SignatureLayout {\\n bytes authenticatorData;\\n bytes clientData;\\n uint256 challengeOffset;\\n uint256[2] rs;\\n }\\n\\n /// @notice Validates the signature\\n /// @param data The data signed\\n /// @param _signature The signature\\n function _validate(bytes memory data, bytes calldata _signature) private view {\\n bytes32 _hash = keccak256(data);\\n SignatureLayout calldata signaturePointer;\\n // This code should precalculate the offsets of variables as defined in the layout\\n // Calldata variables are represented as offsets, and, I think, length for dynamic types\\n // If the calldata is malformed (e.g., shorter than expected), this will revert with an out of bounds error\\n assembly {\\n signaturePointer := _signature.offset\\n }\\n\\n bool valid = FCL_WebAuthn.checkSignature(\\n signaturePointer.authenticatorData,\\n 0x01,\\n signaturePointer.clientData,\\n _hash,\\n signaturePointer.challengeOffset,\\n signaturePointer.rs,\\n x,\\n y\\n );\\n\\n if (!valid) revert InvalidSignature();\\n }\\n\\n /// @dev This function is only callable once and needs to be called immediately\\n /// after deployment by the factory in the same transaction.\\n /// @param x_ The x coordinate of the public key\\n /// @param y_ The y coordinate of the public key\\n function initialize(uint256 x_, uint256 y_) external {\\n if (initialized) revert AlreadyInitialized();\\n initialized = true;\\n x = x_;\\n y = y_;\\n }\\n}\\n\",\"keccak256\":\"0xfc1b006adb6ace0364918015a1aa64439374f813383bcc71290f6b37b66641e5\"},\"contracts/P256SignerFactory.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {P256Signer} from \\\"./P256Signer.sol\\\";\\nimport \\\"solady/src/utils/LibClone.sol\\\";\\n\\n/// @title P256SignerFactory\\n/// @notice Factory contract for creating proxies for P256Signer\\ncontract P256SignerFactory {\\n /// @notice The implementation address of the P256Signer contract\\n address public immutable implementation;\\n\\n constructor(address implementation_) {\\n implementation = implementation_;\\n }\\n\\n /// @notice Emitted when a new P256Signer proxy contract is created\\n event NewSignerCreated(uint256 indexed x, uint256 indexed y, address signer);\\n\\n /// @notice Creates a new P256Signer proxy contract\\n /// @param x The x coordinate of the public key\\n /// @param y The y coordinate of the public key\\n function create(uint256 x, uint256 y) external returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(x, y));\\n address signer = LibClone.cloneDeterministic(implementation, salt);\\n P256Signer(signer).initialize(x, y);\\n emit NewSignerCreated(x, y, signer);\\n return signer;\\n }\\n}\\n\",\"keccak256\":\"0x3bdac08bf7a1c4c1621474b10733f74a9487359212705bbca42ec678aa549a53\"},\"solady/src/utils/LibClone.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Minimal proxy library.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibClone.sol)\\n/// @author Minimal proxy by 0age (https://github.com/0age)\\n/// @author Clones with immutable args by wighawag, zefram.eth, Saw-mon & Natalie\\n/// (https://github.com/Saw-mon-and-Natalie/clones-with-immutable-args)\\n///\\n/// @dev Minimal proxy:\\n/// Although the sw0nt pattern saves 5 gas over the erc-1167 pattern during runtime,\\n/// it is not supported out-of-the-box on Etherscan. Hence, we choose to use the 0age pattern,\\n/// which saves 4 gas over the erc-1167 pattern during runtime, and has the smallest bytecode.\\n///\\n/// @dev Minimal proxy (PUSH0 variant):\\n/// This is a new minimal proxy that uses the PUSH0 opcode introduced during Shanghai.\\n/// It is optimized first for minimal runtime gas, then for minimal bytecode.\\n/// The PUSH0 clone functions are intentionally postfixed with a jarring \\\"_PUSH0\\\" as\\n/// many EVM chains may not support the PUSH0 opcode in the early months after Shanghai.\\n/// Please use with caution.\\n///\\n/// @dev Clones with immutable args (CWIA):\\n/// The implementation of CWIA here implements a `receive()` method that emits the\\n/// `ReceiveETH(uint256)` event. This skips the `DELEGATECALL` when there is no calldata,\\n/// enabling us to accept hard gas-capped `sends` & `transfers` for maximum backwards\\n/// composability. The minimal proxy implementation does not offer this feature.\\nlibrary LibClone {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Unable to deploy the clone.\\n error DeploymentFailed();\\n\\n /// @dev The salt must start with either the zero address or the caller.\\n error SaltDoesNotStartWithCaller();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* MINIMAL PROXY OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Deploys a clone of `implementation`.\\n function clone(address implementation) internal returns (address instance) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n /**\\n * --------------------------------------------------------------------------+\\n * CREATION (9 bytes) |\\n * --------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * --------------------------------------------------------------------------|\\n * 60 runSize | PUSH1 runSize | r | |\\n * 3d | RETURNDATASIZE | 0 r | |\\n * 81 | DUP2 | r 0 r | |\\n * 60 offset | PUSH1 offset | o r 0 r | |\\n * 3d | RETURNDATASIZE | 0 o r 0 r | |\\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\\n * f3 | RETURN | | [0..runSize): runtime code |\\n * --------------------------------------------------------------------------|\\n * RUNTIME (44 bytes) |\\n * --------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * --------------------------------------------------------------------------|\\n * |\\n * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | 0 | |\\n * 3d | RETURNDATASIZE | 0 0 | |\\n * 3d | RETURNDATASIZE | 0 0 0 | |\\n * 3d | RETURNDATASIZE | 0 0 0 0 | |\\n * |\\n * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds 0 0 0 0 | |\\n * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | |\\n * 3d | RETURNDATASIZE | 0 0 cds 0 0 0 0 | |\\n * 37 | CALLDATACOPY | 0 0 0 0 | [0..cds): calldata |\\n * |\\n * ::: delegate call to the implementation contract :::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds 0 0 0 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | [0..cds): calldata |\\n * 73 addr | PUSH20 addr | addr 0 cds 0 0 0 0 | [0..cds): calldata |\\n * 5a | GAS | gas addr 0 cds 0 0 0 0 | [0..cds): calldata |\\n * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata |\\n * |\\n * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata |\\n * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata |\\n * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata |\\n * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata |\\n * |\\n * 60 0x2a | PUSH1 0x2a | 0x2a success 0 rds | [0..rds): returndata |\\n * 57 | JUMPI | 0 rds | [0..rds): returndata |\\n * |\\n * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * fd | REVERT | | [0..rds): returndata |\\n * |\\n * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 5b | JUMPDEST | 0 rds | [0..rds): returndata |\\n * f3 | RETURN | | [0..rds): returndata |\\n * --------------------------------------------------------------------------+\\n */\\n\\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\\n mstore(0x14, implementation)\\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\\n instance := create(0, 0x0c, 0x35)\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x21, 0)\\n }\\n }\\n\\n /// @dev Deploys a deterministic clone of `implementation` with `salt`.\\n function cloneDeterministic(address implementation, bytes32 salt)\\n internal\\n returns (address instance)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\\n mstore(0x14, implementation)\\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\\n instance := create2(0, 0x0c, 0x35, salt)\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x21, 0)\\n }\\n }\\n\\n /// @dev Returns the initialization code hash of the clone of `implementation`.\\n /// Used for mining vanity addresses with create2crunch.\\n function initCodeHash(address implementation) internal pure returns (bytes32 hash) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\\n mstore(0x14, implementation)\\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\\n hash := keccak256(0x0c, 0x35)\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x21, 0)\\n }\\n }\\n\\n /// @dev Returns the address of the deterministic clone of `implementation`,\\n /// with `salt` by `deployer`.\\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\\n function predictDeterministicAddress(address implementation, bytes32 salt, address deployer)\\n internal\\n pure\\n returns (address predicted)\\n {\\n bytes32 hash = initCodeHash(implementation);\\n predicted = predictDeterministicAddress(hash, salt, deployer);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* MINIMAL PROXY OPERATIONS (PUSH0 VARIANT) */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Deploys a PUSH0 clone of `implementation`.\\n function clone_PUSH0(address implementation) internal returns (address instance) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n /**\\n * --------------------------------------------------------------------------+\\n * CREATION (9 bytes) |\\n * --------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * --------------------------------------------------------------------------|\\n * 60 runSize | PUSH1 runSize | r | |\\n * 5f | PUSH0 | 0 r | |\\n * 81 | DUP2 | r 0 r | |\\n * 60 offset | PUSH1 offset | o r 0 r | |\\n * 5f | PUSH0 | 0 o r 0 r | |\\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\\n * f3 | RETURN | | [0..runSize): runtime code |\\n * --------------------------------------------------------------------------|\\n * RUNTIME (45 bytes) |\\n * --------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * --------------------------------------------------------------------------|\\n * |\\n * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |\\n * 5f | PUSH0 | 0 | |\\n * 5f | PUSH0 | 0 0 | |\\n * |\\n * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds 0 0 | |\\n * 5f | PUSH0 | 0 cds 0 0 | |\\n * 5f | PUSH0 | 0 0 cds 0 0 | |\\n * 37 | CALLDATACOPY | 0 0 | [0..cds): calldata |\\n * |\\n * ::: delegate call to the implementation contract :::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds 0 0 | [0..cds): calldata |\\n * 5f | PUSH0 | 0 cds 0 0 | [0..cds): calldata |\\n * 73 addr | PUSH20 addr | addr 0 cds 0 0 | [0..cds): calldata |\\n * 5a | GAS | gas addr 0 cds 0 0 | [0..cds): calldata |\\n * f4 | DELEGATECALL | success | [0..cds): calldata |\\n * |\\n * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | rds success | [0..cds): calldata |\\n * 5f | PUSH0 | 0 rds success | [0..cds): calldata |\\n * 5f | PUSH0 | 0 0 rds success | [0..cds): calldata |\\n * 3e | RETURNDATACOPY | success | [0..rds): returndata |\\n * |\\n * 60 0x29 | PUSH1 0x29 | 0x29 success | [0..rds): returndata |\\n * 57 | JUMPI | | [0..rds): returndata |\\n * |\\n * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | rds | [0..rds): returndata |\\n * 5f | PUSH0 | 0 rds | [0..rds): returndata |\\n * fd | REVERT | | [0..rds): returndata |\\n * |\\n * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 5b | JUMPDEST | | [0..rds): returndata |\\n * 3d | RETURNDATASIZE | rds | [0..rds): returndata |\\n * 5f | PUSH0 | 0 rds | [0..rds): returndata |\\n * f3 | RETURN | | [0..rds): returndata |\\n * --------------------------------------------------------------------------+\\n */\\n\\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\\n mstore(0x14, implementation) // 20\\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\\n instance := create(0, 0x0e, 0x36)\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x24, 0)\\n }\\n }\\n\\n /// @dev Deploys a deterministic PUSH0 clone of `implementation` with `salt`.\\n function cloneDeterministic_PUSH0(address implementation, bytes32 salt)\\n internal\\n returns (address instance)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\\n mstore(0x14, implementation) // 20\\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\\n instance := create2(0, 0x0e, 0x36, salt)\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x24, 0)\\n }\\n }\\n\\n /// @dev Returns the initialization code hash of the PUSH0 clone of `implementation`.\\n /// Used for mining vanity addresses with create2crunch.\\n function initCodeHash_PUSH0(address implementation) internal pure returns (bytes32 hash) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\\n mstore(0x14, implementation) // 20\\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\\n hash := keccak256(0x0e, 0x36)\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x24, 0)\\n }\\n }\\n\\n /// @dev Returns the address of the deterministic PUSH0 clone of `implementation`,\\n /// with `salt` by `deployer`.\\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\\n function predictDeterministicAddress_PUSH0(\\n address implementation,\\n bytes32 salt,\\n address deployer\\n ) internal pure returns (address predicted) {\\n bytes32 hash = initCodeHash_PUSH0(implementation);\\n predicted = predictDeterministicAddress(hash, salt, deployer);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CLONES WITH IMMUTABLE ARGS OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Deploys a minimal proxy with `implementation`,\\n /// using immutable arguments encoded in `data`.\\n ///\\n /// Note: This implementation of CWIA differs from the original implementation.\\n /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.\\n function clone(address implementation, bytes memory data) internal returns (address instance) {\\n assembly {\\n // Compute the boundaries of the data and cache the memory slots around it.\\n let mBefore3 := mload(sub(data, 0x60))\\n let mBefore2 := mload(sub(data, 0x40))\\n let mBefore1 := mload(sub(data, 0x20))\\n let dataLength := mload(data)\\n let dataEnd := add(add(data, 0x20), dataLength)\\n let mAfter1 := mload(dataEnd)\\n\\n // +2 bytes for telling how much data there is appended to the call.\\n let extraLength := add(dataLength, 2)\\n // The `creationSize` is `extraLength + 108`\\n // The `runSize` is `creationSize - 10`.\\n\\n /**\\n * ---------------------------------------------------------------------------------------------------+\\n * CREATION (10 bytes) |\\n * ---------------------------------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * ---------------------------------------------------------------------------------------------------|\\n * 61 runSize | PUSH2 runSize | r | |\\n * 3d | RETURNDATASIZE | 0 r | |\\n * 81 | DUP2 | r 0 r | |\\n * 60 offset | PUSH1 offset | o r 0 r | |\\n * 3d | RETURNDATASIZE | 0 o r 0 r | |\\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\\n * f3 | RETURN | | [0..runSize): runtime code |\\n * ---------------------------------------------------------------------------------------------------|\\n * RUNTIME (98 bytes + extraLength) |\\n * ---------------------------------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * ---------------------------------------------------------------------------------------------------|\\n * |\\n * ::: if no calldata, emit event & return w/o `DELEGATECALL` ::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds | |\\n * 60 0x2c | PUSH1 0x2c | 0x2c cds | |\\n * 57 | JUMPI | | |\\n * 34 | CALLVALUE | cv | |\\n * 3d | RETURNDATASIZE | 0 cv | |\\n * 52 | MSTORE | | [0..0x20): callvalue |\\n * 7f sig | PUSH32 0x9e.. | sig | [0..0x20): callvalue |\\n * 59 | MSIZE | 0x20 sig | [0..0x20): callvalue |\\n * 3d | RETURNDATASIZE | 0 0x20 sig | [0..0x20): callvalue |\\n * a1 | LOG1 | | [0..0x20): callvalue |\\n * 00 | STOP | | [0..0x20): callvalue |\\n * 5b | JUMPDEST | | |\\n * |\\n * ::: copy calldata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds | |\\n * 3d | RETURNDATASIZE | 0 cds | |\\n * 3d | RETURNDATASIZE | 0 0 cds | |\\n * 37 | CALLDATACOPY | | [0..cds): calldata |\\n * |\\n * ::: keep some values in stack :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | 0 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | 0 0 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | 0 0 0 0 | [0..cds): calldata |\\n * 61 extra | PUSH2 extra | e 0 0 0 0 | [0..cds): calldata |\\n * |\\n * ::: copy extra data to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 80 | DUP1 | e e 0 0 0 0 | [0..cds): calldata |\\n * 60 0x62 | PUSH1 0x62 | 0x62 e e 0 0 0 0 | [0..cds): calldata |\\n * 36 | CALLDATASIZE | cds 0x62 e e 0 0 0 0 | [0..cds): calldata |\\n * 39 | CODECOPY | e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * |\\n * ::: delegate call to the implementation contract ::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 01 | ADD | cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 3d | RETURNDATASIZE | 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 73 addr | PUSH20 addr | addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 5a | GAS | gas addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * |\\n * ::: copy return data to memory ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData |\\n * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData |\\n * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata |\\n * |\\n * 60 0x60 | PUSH1 0x60 | 0x60 success 0 rds | [0..rds): returndata |\\n * 57 | JUMPI | 0 rds | [0..rds): returndata |\\n * |\\n * ::: revert ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * fd | REVERT | | [0..rds): returndata |\\n * |\\n * ::: return ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 5b | JUMPDEST | 0 rds | [0..rds): returndata |\\n * f3 | RETURN | | [0..rds): returndata |\\n * ---------------------------------------------------------------------------------------------------+\\n */\\n // Write the bytecode before the data.\\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\\n // Write the address of the implementation.\\n mstore(sub(data, 0x0d), implementation)\\n // Write the rest of the bytecode.\\n mstore(\\n sub(data, 0x21),\\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\\n )\\n // `keccak256(\\\"ReceiveETH(uint256)\\\")`\\n mstore(\\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\\n )\\n mstore(\\n // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.\\n // The actual EVM limit may be smaller and may change over time.\\n sub(data, add(0x59, lt(extraLength, 0xff9e))),\\n or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)\\n )\\n mstore(dataEnd, shl(0xf0, extraLength))\\n\\n // Create the instance.\\n instance := create(0, sub(data, 0x4c), add(extraLength, 0x6c))\\n\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n\\n // Restore the overwritten memory surrounding `data`.\\n mstore(dataEnd, mAfter1)\\n mstore(data, dataLength)\\n mstore(sub(data, 0x20), mBefore1)\\n mstore(sub(data, 0x40), mBefore2)\\n mstore(sub(data, 0x60), mBefore3)\\n }\\n }\\n\\n /// @dev Deploys a deterministic clone of `implementation`,\\n /// using immutable arguments encoded in `data`, with `salt`.\\n ///\\n /// Note: This implementation of CWIA differs from the original implementation.\\n /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.\\n function cloneDeterministic(address implementation, bytes memory data, bytes32 salt)\\n internal\\n returns (address instance)\\n {\\n assembly {\\n // Compute the boundaries of the data and cache the memory slots around it.\\n let mBefore3 := mload(sub(data, 0x60))\\n let mBefore2 := mload(sub(data, 0x40))\\n let mBefore1 := mload(sub(data, 0x20))\\n let dataLength := mload(data)\\n let dataEnd := add(add(data, 0x20), dataLength)\\n let mAfter1 := mload(dataEnd)\\n\\n // +2 bytes for telling how much data there is appended to the call.\\n let extraLength := add(dataLength, 2)\\n\\n // Write the bytecode before the data.\\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\\n // Write the address of the implementation.\\n mstore(sub(data, 0x0d), implementation)\\n // Write the rest of the bytecode.\\n mstore(\\n sub(data, 0x21),\\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\\n )\\n // `keccak256(\\\"ReceiveETH(uint256)\\\")`\\n mstore(\\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\\n )\\n mstore(\\n // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.\\n // The actual EVM limit may be smaller and may change over time.\\n sub(data, add(0x59, lt(extraLength, 0xff9e))),\\n or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)\\n )\\n mstore(dataEnd, shl(0xf0, extraLength))\\n\\n // Create the instance.\\n instance := create2(0, sub(data, 0x4c), add(extraLength, 0x6c), salt)\\n\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n\\n // Restore the overwritten memory surrounding `data`.\\n mstore(dataEnd, mAfter1)\\n mstore(data, dataLength)\\n mstore(sub(data, 0x20), mBefore1)\\n mstore(sub(data, 0x40), mBefore2)\\n mstore(sub(data, 0x60), mBefore3)\\n }\\n }\\n\\n /// @dev Returns the initialization code hash of the clone of `implementation`\\n /// using immutable arguments encoded in `data`.\\n /// Used for mining vanity addresses with create2crunch.\\n function initCodeHash(address implementation, bytes memory data)\\n internal\\n pure\\n returns (bytes32 hash)\\n {\\n assembly {\\n // Compute the boundaries of the data and cache the memory slots around it.\\n let mBefore3 := mload(sub(data, 0x60))\\n let mBefore2 := mload(sub(data, 0x40))\\n let mBefore1 := mload(sub(data, 0x20))\\n let dataLength := mload(data)\\n let dataEnd := add(add(data, 0x20), dataLength)\\n let mAfter1 := mload(dataEnd)\\n\\n // Do a out-of-gas revert if `dataLength` is too big. 0xffff - 0x02 - 0x62 = 0xff9b.\\n // The actual EVM limit may be smaller and may change over time.\\n returndatacopy(returndatasize(), returndatasize(), gt(dataLength, 0xff9b))\\n\\n // +2 bytes for telling how much data there is appended to the call.\\n let extraLength := add(dataLength, 2)\\n\\n // Write the bytecode before the data.\\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\\n // Write the address of the implementation.\\n mstore(sub(data, 0x0d), implementation)\\n // Write the rest of the bytecode.\\n mstore(\\n sub(data, 0x21),\\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\\n )\\n // `keccak256(\\\"ReceiveETH(uint256)\\\")`\\n mstore(\\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\\n )\\n mstore(\\n sub(data, 0x5a),\\n or(shl(0x78, add(extraLength, 0x62)), 0x6100003d81600a3d39f336602c57343d527f)\\n )\\n mstore(dataEnd, shl(0xf0, extraLength))\\n\\n // Compute and store the bytecode hash.\\n hash := keccak256(sub(data, 0x4c), add(extraLength, 0x6c))\\n\\n // Restore the overwritten memory surrounding `data`.\\n mstore(dataEnd, mAfter1)\\n mstore(data, dataLength)\\n mstore(sub(data, 0x20), mBefore1)\\n mstore(sub(data, 0x40), mBefore2)\\n mstore(sub(data, 0x60), mBefore3)\\n }\\n }\\n\\n /// @dev Returns the address of the deterministic clone of\\n /// `implementation` using immutable arguments encoded in `data`, with `salt`, by `deployer`.\\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\\n function predictDeterministicAddress(\\n address implementation,\\n bytes memory data,\\n bytes32 salt,\\n address deployer\\n ) internal pure returns (address predicted) {\\n bytes32 hash = initCodeHash(implementation, data);\\n predicted = predictDeterministicAddress(hash, salt, deployer);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* OTHER OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the address when a contract with initialization code hash,\\n /// `hash`, is deployed with `salt`, by `deployer`.\\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\\n function predictDeterministicAddress(bytes32 hash, bytes32 salt, address deployer)\\n internal\\n pure\\n returns (address predicted)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Compute and store the bytecode hash.\\n mstore8(0x00, 0xff) // Write the prefix.\\n mstore(0x35, hash)\\n mstore(0x01, shl(96, deployer))\\n mstore(0x15, salt)\\n predicted := keccak256(0x00, 0x55)\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x35, 0)\\n }\\n }\\n\\n /// @dev Reverts if `salt` does not start with either the zero address or the caller.\\n function checkStartsWithCaller(bytes32 salt) internal view {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // If the salt does not start with the zero address or the caller.\\n if iszero(or(iszero(shr(96, salt)), eq(caller(), shr(96, salt)))) {\\n // Store the function selector of `SaltDoesNotStartWithCaller()`.\\n mstore(0x00, 0x2f634836)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x159b64c65da9e6efe93b8df8c6bb1c7672a7511dcaba414aaa3e447f6d7065e6\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a060405234801561001057600080fd5b5060405161031a38038061031a83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b60805161028a610090600039600081816040015260d7015261028a6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80635c60da1b1461003b5780639f7b45791461008b575b600080fd5b6100627f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b610062610099366004610232565b60008083836040516020016100b8929190918252602082015260400190565b60405160208183030381529060405280519060200120905060006100fc7f0000000000000000000000000000000000000000000000000000000000000000836101db565b6040517fe4a30116000000000000000000000000000000000000000000000000000000008152600481018790526024810186905290915073ffffffffffffffffffffffffffffffffffffffff82169063e4a3011690604401600060405180830381600087803b15801561016e57600080fd5b505af1158015610182573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841681528692508791507f33b61205835e3063eb8935cac4b29d7fc333ad80d6cb11893ba4758adf8cdde19060200160405180910390a3949350505050565b60006c5af43d3d93803e602a57fd5bf36021528260145273602c3d8160093d39f33d3d3d3d363d3d37363d73600052816035600c6000f59050806102275763301164256000526004601cfd5b600060215292915050565b6000806040838503121561024557600080fd5b5050803592602090910135915056fea264697066735822122071f53aa036351be28c2415d8e5721596cc980c32c199aac9af70658e7c86902d64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80635c60da1b1461003b5780639f7b45791461008b575b600080fd5b6100627f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b610062610099366004610232565b60008083836040516020016100b8929190918252602082015260400190565b60405160208183030381529060405280519060200120905060006100fc7f0000000000000000000000000000000000000000000000000000000000000000836101db565b6040517fe4a30116000000000000000000000000000000000000000000000000000000008152600481018790526024810186905290915073ffffffffffffffffffffffffffffffffffffffff82169063e4a3011690604401600060405180830381600087803b15801561016e57600080fd5b505af1158015610182573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841681528692508791507f33b61205835e3063eb8935cac4b29d7fc333ad80d6cb11893ba4758adf8cdde19060200160405180910390a3949350505050565b60006c5af43d3d93803e602a57fd5bf36021528260145273602c3d8160093d39f33d3d3d3d363d3d37363d73600052816035600c6000f59050806102275763301164256000526004601cfd5b600060215292915050565b6000806040838503121561024557600080fd5b5050803592602090910135915056fea264697066735822122071f53aa036351be28c2415d8e5721596cc980c32c199aac9af70658e7c86902d64736f6c63430008140033", + "devdoc": { + "kind": "dev", + "methods": { + "create(uint256,uint256)": { + "params": { + "x": "The x coordinate of the public key", + "y": "The y coordinate of the public key" + } + } + }, + "title": "P256SignerFactory", + "version": 1 + }, + "userdoc": { + "events": { + "NewSignerCreated(uint256,uint256,address)": { + "notice": "Emitted when a new P256Signer proxy contract is created" + } + }, + "kind": "user", + "methods": { + "create(uint256,uint256)": { + "notice": "Creates a new P256Signer proxy contract" + }, + "implementation()": { + "notice": "The implementation address of the P256Signer contract" + } + }, + "notice": "Factory contract for creating proxies for P256Signer", + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/deployments/muster_production/solcInputs/c99418166b2fc7a84fdc0f742530dbd8.json b/deployments/muster_production/solcInputs/c99418166b2fc7a84fdc0f742530dbd8.json new file mode 100644 index 0000000..fdb6b70 --- /dev/null +++ b/deployments/muster_production/solcInputs/c99418166b2fc7a84fdc0f742530dbd8.json @@ -0,0 +1,57 @@ +{ + "language": "Solidity", + "sources": { + "contracts/P256Signer.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport {FCL_WebAuthn} from \"FreshCryptoLib/FCL_Webauthn.sol\";\n\n/// @title P256Signer\n/// @notice A contract used to verify ECDSA signatures over secp256r1 through\n/// EIP-1271 of Webauthn payloads.\n/// @dev This contract is the implementation. It is meant to be used through\n/// proxy clone.\ncontract P256Signer {\n /// @notice The EIP-1271 magic value\n bytes4 internal constant EIP1271_MAGICVALUE = 0x1626ba7e;\n\n /// @notice The old EIP-1271 magic value\n bytes4 internal constant OLD_EIP1271_MAGICVALUE = 0x20c13b0b;\n\n /// @notice Whether the contract has been initialized\n bool public initialized;\n\n /// @notice The x coordinate of the secp256r1 public key\n uint256 public x;\n\n /// @notice The y coordinate of the secp256r1 public key\n uint256 public y;\n\n /// @notice Error message when the signature is invalid\n error InvalidSignature();\n\n /// @notice Error message when the hash is invalid\n error InvalidHash();\n\n /// @notice Error message when the contract is already initialized\n error AlreadyInitialized();\n\n constructor() {\n initialized = true;\n }\n\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\n /// @param _hash The hash of the data signed\n /// @param _signature The signature\n /// @return The EIP-1271 magic value\n function isValidSignature(bytes32 _hash, bytes calldata _signature) public view returns (bytes4) {\n _validate(abi.encode(_hash), _signature);\n return EIP1271_MAGICVALUE;\n }\n\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\n /// @dev This is the old version of the function of EIP-1271 using bytes\n /// memory instead of bytes32\n /// @param _hash The hash of the data signed\n /// @param _signature The signature\n /// @return The EIP-1271 magic value\n function isValidSignature(bytes memory _hash, bytes calldata _signature) public view returns (bytes4) {\n _validate(_hash, _signature);\n return OLD_EIP1271_MAGICVALUE;\n }\n\n struct SignatureLayout {\n bytes authenticatorData;\n bytes clientData;\n uint256 challengeOffset;\n uint256[2] rs;\n }\n\n /// @notice Validates the signature\n /// @param data The data signed\n /// @param _signature The signature\n function _validate(bytes memory data, bytes calldata _signature) private view {\n bytes32 _hash = keccak256(data);\n SignatureLayout calldata signaturePointer;\n // This code should precalculate the offsets of variables as defined in the layout\n // Calldata variables are represented as offsets, and, I think, length for dynamic types\n // If the calldata is malformed (e.g., shorter than expected), this will revert with an out of bounds error\n assembly {\n signaturePointer := _signature.offset\n }\n\n bool valid = FCL_WebAuthn.checkSignature(\n signaturePointer.authenticatorData,\n 0x01,\n signaturePointer.clientData,\n _hash,\n signaturePointer.challengeOffset,\n signaturePointer.rs,\n x,\n y\n );\n\n if (!valid) revert InvalidSignature();\n }\n\n /// @dev This function is only callable once and needs to be called immediately\n /// after deployment by the factory in the same transaction.\n /// @param x_ The x coordinate of the public key\n /// @param y_ The y coordinate of the public key\n function initialize(uint256 x_, uint256 y_) external {\n if (initialized) revert AlreadyInitialized();\n initialized = true;\n x = x_;\n y = y_;\n }\n}\n" + }, + "contracts/P256SignerFactory.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport {P256Signer} from \"./P256Signer.sol\";\nimport \"solady/src/utils/LibClone.sol\";\n\n/// @title P256SignerFactory\n/// @notice Factory contract for creating proxies for P256Signer\ncontract P256SignerFactory {\n /// @notice The implementation address of the P256Signer contract\n address public immutable implementation;\n\n constructor(address implementation_) {\n implementation = implementation_;\n }\n\n /// @notice Emitted when a new P256Signer proxy contract is created\n event NewSignerCreated(uint256 indexed x, uint256 indexed y, address signer);\n\n /// @notice Creates a new P256Signer proxy contract\n /// @param x The x coordinate of the public key\n /// @param y The y coordinate of the public key\n function create(uint256 x, uint256 y) external returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(x, y));\n address signer = LibClone.cloneDeterministic(implementation, salt);\n P256Signer(signer).initialize(x, y);\n emit NewSignerCreated(x, y, signer);\n return signer;\n }\n}\n" + }, + "FreshCryptoLib/FCL_ecdsa_utils.sol": { + "content": "\n//********************************************************************************************/\n// ___ _ ___ _ _ _ _\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\n// | _| '_/ -_|_-< ' \\ | (__| '_| || | '_ \\ _/ _ \\ | |__| | '_ \\\n// |_||_| \\___/__/_||_| \\___|_| \\_, | .__/\\__\\___/ |____|_|_.__/\n// |__/|_|\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\n///* License: This software is licensed under MIT License\n///* This Code may be reused including license and copyright notice.\n///* See LICENSE file at the root folder of the project.\n///* FILE: FCL_ecdsa.sol\n///*\n///*\n///* DESCRIPTION: ecdsa verification implementation\n///*\n//**************************************************************************************/\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\n// if ever used for other curve than sec256R1\n// SPDX-License-Identifier: MIT\npragma solidity >=0.8.19 <0.9.0;\n\n\nimport {FCL_Elliptic_ZZ} from \"./FCL_elliptic.sol\";\n\n\n\nlibrary FCL_ecdsa_utils {\n // Set parameters for curve sec256r1.public\n //curve order (number of points)\n uint256 constant n = FCL_Elliptic_ZZ.n;\n \n /**\n * @dev ECDSA verification, given , signature, and public key.\n */\n\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256 Qx, uint256 Qy) internal view returns (bool) {\n uint256 r = rs[0];\n uint256 s = rs[1];\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return false;\n }\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\n return false;\n }\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\n uint256 x1;\n\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\n x1= addmod(x1, n-r,n );\n \n \n return x1 == 0;\n }\n\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\n return ecdsa_verify(message, rs, Q[0], Q[1]);\n }\n\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\n {\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return address(0);\n }\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\n\n uint256 Qx;\n uint256 Qy;\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\n\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\n }\n\n\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\n //K is nonce, kpriv is private key\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) internal view returns(uint256 r, uint256 s)\n {\n r=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\n r=addmod(0,r, FCL_Elliptic_ZZ.n); \n s=mulmod(FCL_Elliptic_ZZ.FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n);//s=k^-1.(h+r.kpriv)\n\n \n if(r==0||s==0){\n revert();\n }\n\n\n }\n\n //ecdsa key derivation\n //kpriv is private key return (x,y) coordinates of associated Pubkey\n function ecdsa_derivKpub(uint256 kpriv) internal view returns(uint256 x, uint256 y)\n {\n \n x=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, kpriv, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\n y=FCL_Elliptic_ZZ.ec_Decompress(x, 1);\n \n if (FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(x, y, kpriv, FCL_Elliptic_ZZ.n - 1) != 0) //extract correct y value\n {\n y=FCL_Elliptic_ZZ.p-y;\n } \n\n }\n \n //precomputations for 8 dimensional trick\n function Precalc_8dim( uint256 Qx, uint256 Qy) internal view returns( uint[2][256] memory Prec)\n {\n \n uint[2][8] memory Pow64_PQ; //store P, 64P, 128P, 192P, Q, 64Q, 128Q, 192Q\n \n //the trivial private keys 1 and -1 are forbidden\n if(Qx==FCL_Elliptic_ZZ.gx)\n {\n revert();\n }\n Pow64_PQ[0][0]=FCL_Elliptic_ZZ.gx;\n Pow64_PQ[0][1]=FCL_Elliptic_ZZ.gy;\n \n Pow64_PQ[4][0]=Qx;\n Pow64_PQ[4][1]=Qy;\n \n /* raise to multiplication by 64 by 6 consecutive doubling*/\n for(uint j=1;j<4;j++){\n uint256 x;\n uint256 y;\n uint256 zz;\n uint256 zzz;\n \n \t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j-1][0], Pow64_PQ[j-1][1], 1, 1);\n \t(Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\n (x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+3][0], Pow64_PQ[j+3][1], 1, 1);\n \t(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\n\n \tfor(uint i=0;i<63;i++){\n \t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j][0], Pow64_PQ[j][1],1,1);\n (Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\n \t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1],1,1);\n (Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\n \t}\n }\n \n /* neutral point */\n Prec[0][0]=0;\n Prec[0][1]=0;\n \n \t\n for(uint i=1;i<256;i++)\n { \n Prec[i][0]=0;\n Prec[i][1]=0;\n \n for(uint j=0;j<8;j++)\n {\n \tif( (i&(1<=0.8.19 <0.9.0;\n\n\nimport {FCL_Elliptic_ZZ} from \"./FCL_elliptic.sol\";\n\n\n\nlibrary FCL_ecdsa {\n // Set parameters for curve sec256r1.public\n //curve order (number of points)\n uint256 constant n = FCL_Elliptic_ZZ.n;\n \n /**\n * @dev ECDSA verification, given , signature, and public key.\n */\n\n /**\n * @dev ECDSA verification, given , signature, and public key, no calldata version\n */\n function ecdsa_verify(bytes32 message, uint256 r, uint256 s, uint256 Qx, uint256 Qy) internal view returns (bool){\n\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return false;\n }\n \n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\n return false;\n }\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\n uint256 x1;\n\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\n\n x1= addmod(x1, n-r,n );\n \n return x1 == 0;\n }\n\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\n {\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return address(0);\n }\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\n\n uint256 Qx;\n uint256 Qy;\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\n\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\n }\n\n function ecdsa_precomputed_verify(bytes32 message, uint256 r, uint256 s, address Shamir8)\n internal view\n returns (bool)\n {\n \n if (r == 0 || r >= n || s == 0 || s >= n) {\n return false;\n }\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\n if (!isOnCurve(Q[0], Q[1])) {\n return false;\n }*/\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 X;\n\n //Shamir 8 dimensions\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\n\n X= addmod(X, n-r,n );\n\n return X == 0;\n } //end ecdsa_precomputed_verify()\n\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\n internal view\n returns (bool)\n {\n uint256 r = rs[0];\n uint256 s = rs[1];\n if (r == 0 || r >= n || s == 0 || s >= n) {\n return false;\n }\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\n if (!isOnCurve(Q[0], Q[1])) {\n return false;\n }*/\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 X;\n\n //Shamir 8 dimensions\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\n\n X= addmod(X, n-r,n );\n\n return X == 0;\n } //end ecdsa_precomputed_verify()\n\n}\n" + }, + "FreshCryptoLib/FCL_elliptic.sol": { + "content": "//********************************************************************************************/\n// ___ _ ___ _ _ _ _\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\n// | _| '_/ -_|_-< ' \\ | (__| '_| || | '_ \\ _/ _ \\ | |__| | '_ \\\n// |_||_| \\___/__/_||_| \\___|_| \\_, | .__/\\__\\___/ |____|_|_.__/\n// |__/|_|\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\n///* License: This software is licensed under MIT License\n///* This Code may be reused including license and copyright notice.\n///* See LICENSE file at the root folder of the project.\n///* FILE: FCL_elliptic.sol\n///*\n///*\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\n///* optimization\n///*\n//**************************************************************************************/\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\n// if ever used for other curve than sec256R1\n// SPDX-License-Identifier: MIT\npragma solidity >=0.8.19 <0.9.0;\n\nlibrary FCL_Elliptic_ZZ {\n // Set parameters for curve sec256r1.\n\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\n //curve prime field modulus\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n //short weierstrass first coefficient\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\n //short weierstrass second coefficient\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\n //generating point affine coordinates\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\n //curve order (number of points)\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\n /* -2 mod n constant, used to speed up inversion*/\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\n\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\n //P+1 div 4\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\n //arbitrary constant to express no quadratic residuosity\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n\n /**\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\n */\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\n assembly {\n let pointer := mload(0x40)\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(pointer, 0x20)\n mstore(add(pointer, 0x20), 0x20)\n mstore(add(pointer, 0x40), 0x20)\n // Define variables base, exponent and modulus\n mstore(add(pointer, 0x60), u)\n mstore(add(pointer, 0x80), minus_2modn)\n mstore(add(pointer, 0xa0), n)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\n result := mload(pointer)\n }\n }\n /**\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\n */\n\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\n assembly {\n let pointer := mload(0x40)\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(pointer, 0x20)\n mstore(add(pointer, 0x20), 0x20)\n mstore(add(pointer, 0x40), 0x20)\n // Define variables base, exponent and modulus\n mstore(add(pointer, 0x60), u)\n mstore(add(pointer, 0x80), minus_2)\n mstore(add(pointer, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\n result := mload(pointer)\n }\n }\n\n //Coron projective shuffling, take as input alpha as blinding factor\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\n {\n \n uint256 alpha2=mulmod(alpha,alpha,p);\n \n x3=mulmod(alpha2, x,p); //alpha^-2.x\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\n\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\n \n return (x3, y3, zz3, zzz3);\n }\n\n\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\n {\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\n u2=addmod(u2, p-u1, p);// P = U2-U1\n x1=mulmod(u2, u2, p);//PP\n x2=mulmod(x1, u2, p);//PPP\n \n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\n\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\n\n return (x3, y3, zz3, zzz3);\n }\n\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\n/// @param self The integer of which to find the modular inverse\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\n\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\n assembly (\"memory-safe\") {\n // load the free memory pointer value\n let pointer := mload(0x40)\n\n // Define length of base (Bsize)\n mstore(pointer, 0x20)\n // Define the exponent size (Esize)\n mstore(add(pointer, 0x20), 0x20)\n // Define the modulus size (Msize)\n mstore(add(pointer, 0x40), 0x20)\n // Define variables base (B)\n mstore(add(pointer, 0x60), self)\n // Define the exponent (E)\n mstore(add(pointer, 0x80), pp1div4)\n // We save the point of the last argument, it will be override by the result\n // of the precompile call in order to avoid paying for the memory expansion properly\n let _result := add(pointer, 0xa0)\n // Define the modulus (M)\n mstore(_result, p)\n\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\n if iszero(\n staticcall(\n not(0), // amount of gas to send\n MODEXP_PRECOMPILE, // target\n pointer, // argsOffset\n 0xc0, // argsSize (6 * 32 bytes)\n _result, // retOffset (we override M to avoid paying for the memory expansion)\n 0x20 // retSize (32 bytes)\n )\n ) { revert(0, 0) }\n\n result := mload(_result)\n// result :=addmod(result,0,p)\n }\n if(mulmod(result,result,p)!=self){\n result=_NOTSQUARE;\n }\n \n return result;\n}\n /**\n * /* @dev Convert from affine rep to XYZZ rep\n */\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\n unchecked {\n P[2] = 1; //ZZ\n P[3] = 1; //ZZZ\n P[0] = x0;\n P[1] = y0;\n }\n }\n\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \n\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\n\n y=SqrtMod(y2);\n if(y==_NOTSQUARE){\n return _NOTONCURVE;\n }\n if((y&1)!=(parity&1)){\n y=p-y;\n }\n }\n\n /**\n * /* @dev Convert from XYZZ rep to affine rep\n */\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\n y1 = mulmod(y, zzzInv, p); //Y/zzz\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\n zzzInv = mulmod(_b, _b, p); //1/zz\n x1 = mulmod(x, zzzInv, p); //X/zz\n }\n\n /**\n * /* @dev Sutherland2008 doubling\n */\n /* The \"dbl-2008-s-1\" doubling formulas */\n\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\n internal\n pure\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\n {\n unchecked {\n assembly {\n P0 := mulmod(2, y, p) //U = 2*Y1\n P2 := mulmod(P0, P0, p) // V=U^2\n P3 := mulmod(x, P2, p) // S = X1*V\n P1 := mulmod(P0, P2, p) // W=UV\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\n }\n }\n return (P0, P1, P2, P3);\n }\n\n /**\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\n */\n\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\n internal\n pure\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\n {\n unchecked {\n if (y1 == 0) {\n return (x2, y2, 1, 1);\n }\n\n assembly {\n y1 := sub(p, y1)\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\n P0 := mulmod(x2, x2, p) //PP = P^2\n P1 := mulmod(P0, x2, p) //PPP = P*PP\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\n }\n //end assembly\n } //end unchecked\n return (P0, P1, P2, P3);\n }\n\n /**\n * @dev Return the zero curve in XYZZ coordinates.\n */\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\n return (0, 0, 0, 0);\n }\n /**\n * @dev Check if point is the neutral of the curve\n */\n\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\n return y0 == 0;\n }\n /**\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\n */\n\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\n return (0, 0);\n }\n\n /**\n * @dev Check if the curve is the zero curve in affine rep.\n */\n // uint256 x, uint256 y)\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\n return (y == 0);\n }\n\n /**\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\n */\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\n if ( ((0 == x)&&( 0 == y)) || x == p || y == p) {\n return false;\n }\n unchecked {\n uint256 LHS = mulmod(y, y, p); // y^2\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\n\n return LHS == RHS;\n }\n }\n\n /**\n * @dev Add two elliptic curve points in affine coordinates. Deal with P=Q\n */\n\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\n uint256 zz0;\n uint256 zzz0;\n\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\n if((x0==x1)&&(y0==y1)) {\n (x0, y0, zz0, zzz0) = ecZZ_Dbl(x0, y0,1,1);\n }\n else{\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\n }\n\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\n }\n\n /**\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\n * Returns only x for ECDSA use \n * */\n function ecZZ_mulmuladd_S_asm(\n uint256 Q0,\n uint256 Q1, //affine rep for input point Q\n uint256 scalar_u,\n uint256 scalar_v\n ) internal view returns (uint256 X) {\n uint256 zz;\n uint256 zzz;\n uint256 Y;\n uint256 index = 255;\n uint256 H0;\n uint256 H1;\n\n unchecked {\n if (scalar_u == 0 && scalar_v == 0) return 0;\n\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); \n if((H0==0)&&(H1==0))//handling Q=-G\n {\n scalar_u=addmod(scalar_u, n-scalar_v, n);\n scalar_v=0;\n\n }\n assembly {\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\n index := sub(index, 1)\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n } {}\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if eq(zz, 1) {\n X := gx\n Y := gy\n }\n if eq(zz, 2) {\n X := Q0\n Y := Q1\n }\n if eq(zz, 3) {\n X := H0\n Y := H1\n }\n\n index := sub(index, 1)\n zz := 1\n zzz := 1\n\n for {} gt(minus_1, index) { index := sub(index, 1) } {\n // inlined EcZZ_Dbl\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n T1 := mulmod(T1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n {\n //value of dibit\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if iszero(T4) {\n Y := sub(p, Y) //restore the -Y inversion\n continue\n } // if T4!=0\n\n if eq(T4, 1) {\n T1 := gx\n T2 := gy\n }\n if eq(T4, 2) {\n T1 := Q0\n T2 := Q1\n }\n if eq(T4, 3) {\n T1 := H0\n T2 := H1\n }\n if iszero(zz) {\n X := T1\n Y := T2\n zz := 1\n zzz := 1\n continue\n }\n // inlined EcZZ_AddN\n\n //T3:=sub(p, Y)\n //T3:=Y\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\n\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\n //todo : construct edge vector case\n if iszero(y2) {\n if iszero(T2) {\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\n T2 := mulmod(T1, T1, p) // V=U^2\n T3 := mulmod(X, T2, p) // S = X1*V\n\n T1 := mulmod(T1, T2, p) // W=UV\n y2 := mulmod(addmod(X, zz, p), addmod(X, sub(p, zz), p), p) //(X-ZZ)(X+ZZ)\n T4 := mulmod(3, y2, p) //M=3*(X-ZZ)(X+ZZ)\n\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\n\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\n\n continue\n }\n }\n\n T4 := mulmod(T2, T2, p) //PP\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\n zz := mulmod(zz, T4, p)\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\n let TT2 := mulmod(X, T4, p)\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\n\n X := T4\n }\n } //end loop\n let T := mload(0x40)\n mstore(add(T, 0x60), zz)\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n //Y:=mulmod(Y,zzz,p)//Y/zzz\n //zz :=mulmod(zz, mload(T),p) //1/z\n //zz:= mulmod(zz,zz,p) //1/zz\n X := mulmod(X, mload(T), p) //X/zz\n } //end assembly\n } //end unchecked\n\n return X;\n }\n\n\n /**\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\n * Returns affine representation of point (normalized) \n * */\n function ecZZ_mulmuladd(\n uint256 Q0,\n uint256 Q1, //affine rep for input point Q\n uint256 scalar_u,\n uint256 scalar_v\n ) internal view returns (uint256 X, uint256 Y) {\n uint256 zz;\n uint256 zzz;\n uint256 index = 255;\n uint256[6] memory T;\n uint256[2] memory H;\n \n unchecked {\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\n\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\n\n assembly {\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\n index := sub(index, 1)\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n } {}\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if eq(zz, 1) {\n X := gx\n Y := gy\n }\n if eq(zz, 2) {\n X := Q0\n Y := Q1\n }\n if eq(zz, 3) {\n Y := mload(add(H,32))\n X := mload(H)\n }\n\n index := sub(index, 1)\n zz := 1\n zzz := 1\n\n for {} gt(minus_1, index) { index := sub(index, 1) } {\n // inlined EcZZ_Dbl\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n T1 := mulmod(T1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n {\n //value of dibit\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if iszero(T4) {\n Y := sub(p, Y) //restore the -Y inversion\n continue\n } // if T4!=0\n\n if eq(T4, 1) {\n T1 := gx\n T2 := gy\n }\n if eq(T4, 2) {\n T1 := Q0\n T2 := Q1\n }\n if eq(T4, 3) {\n T1 := mload(H)\n T2 := mload(add(H,32))\n }\n if iszero(zz) {\n X := T1\n Y := T2\n zz := 1\n zzz := 1\n continue\n }\n // inlined EcZZ_AddN\n\n //T3:=sub(p, Y)\n //T3:=Y\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\n\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\n //todo : construct edge vector case\n if iszero(y2) {\n if iszero(T2) {\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\n T2 := mulmod(T1, T1, p) // V=U^2\n T3 := mulmod(X, T2, p) // S = X1*V\n\n T1 := mulmod(T1, T2, p) // W=UV\n y2 := addmod(X, zz, p) //X+ZZ\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\n T4 := mulmod(3, y2, p) //M\n\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\n\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\n\n continue\n }\n }\n\n T4 := mulmod(T2, T2, p) //PP\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\n zz := mulmod(zz, T4, p)\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\n let TT2 := mulmod(X, T4, p)\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\n\n X := T4\n }\n } //end loop\n mstore(add(T, 0x60), zzz)\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n Y:=mulmod(Y,mload(T),p)//Y/zzz\n zz :=mulmod(zz, mload(T),p) //1/z\n zz:= mulmod(zz,zz,p) //1/zz\n X := mulmod(X, zz, p) //X/zz\n } //end assembly\n } //end unchecked\n\n return (X,Y);\n }\n\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\n //contract at given address dataPointer\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\n // the external tool to generate tables from public key is in the /sage directory\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\n internal view\n returns (uint256 X /*, uint Y*/ )\n {\n unchecked {\n uint256 zz; // third and coordinates of the point\n\n uint256[6] memory T;\n zz = 256; //start index\n\n while (T[0] == 0) {\n zz = zz - 1;\n //tbd case of msb octobit is null\n T[0] = 64\n * (\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\n );\n }\n assembly {\n extcodecopy(dataPointer, T, mload(T), 64)\n let index := sub(zz, 1)\n X := mload(T)\n let Y := mload(add(T, 32))\n let zzz := 1\n zz := 1\n\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\n for {} gt(index, 191) { index := add(index, 191) } {\n //inline Double\n {\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(TT1, TT1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n let T1 := mulmod(TT1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n /* compute element to access in precomputed table */\n }\n {\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\n let index2 := sub(index, 64)\n let T3 :=\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\n let index3 := sub(index2, 64)\n let T2 :=\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\n index := sub(index3, 64)\n let T1 :=\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\n\n //tbd: check validity of formulae with (0,1) to remove conditional jump\n if iszero(T1) {\n Y := sub(p, Y)\n\n continue\n }\n extcodecopy(dataPointer, T, T1, 64)\n }\n\n {\n /* Access to precomputed table using extcodecopy hack */\n\n // inlined EcZZ_AddN\n if iszero(zz) {\n X := mload(T)\n Y := mload(add(T, 32))\n zz := 1\n zzz := 1\n\n continue\n }\n\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\n\n //special case ecAdd(P,P)=EcDbl\n if iszero(y2) {\n if iszero(T2) {\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\n T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n\n T1 := mulmod(T1, T2, p) // W=UV\n y2 := addmod(X, zz, p) //X+ZZ\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\n let T4 := mulmod(3, y2, p) //M\n\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\n\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\n\n continue\n }\n }\n\n let T4 := mulmod(T2, T2, p)\n let T1 := mulmod(T4, T2, p) //\n zz := mulmod(zz, T4, p)\n //zzz3=V*ZZ1\n zzz := mulmod(zzz, T1, p) // W=UV/\n let zz1 := mulmod(X, T4, p)\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\n }\n } //end loop\n mstore(add(T, 0x60), zz)\n\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n zz := mload(T)\n X := mulmod(X, zz, p) //X/zz\n }\n } //end unchecked\n }\n\n \n\n // improving the extcodecopy trick : append array at end of contract\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\n internal view\n returns (uint256 X /*, uint Y*/ )\n {\n uint256 zz; // third and coordinates of the point\n\n uint256[6] memory T;\n zz = 256; //start index\n\n unchecked {\n while (T[0] == 0) {\n zz = zz - 1;\n //tbd case of msb octobit is null\n T[0] = 64\n * (\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\n );\n }\n assembly {\n codecopy(T, add(mload(T), dataPointer), 64)\n X := mload(T)\n let Y := mload(add(T, 32))\n let zzz := 1\n zz := 1\n\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n T1 := mulmod(T1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n /* compute element to access in precomputed table */\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\n index := sub(index, 64)\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\n index := sub(index, 64)\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\n index := sub(index, 64)\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\n //index:=add(index,192), restore index, interleaved with loop\n\n //tbd: check validity of formulae with (0,1) to remove conditional jump\n if iszero(T4) {\n Y := sub(p, Y)\n\n continue\n }\n {\n /* Access to precomputed table using extcodecopy hack */\n codecopy(T, add(T4, dataPointer), 64)\n\n // inlined EcZZ_AddN\n\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\n T4 := mulmod(T2, T2, p)\n T1 := mulmod(T4, T2, p)\n T2 := mulmod(zz, T4, p) // W=UV\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\n let zz1 := mulmod(X, T4, p)\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\n zz := T2\n X := T4\n }\n } //end loop\n mstore(add(T, 0x60), zz)\n\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n zz := mload(T)\n X := mulmod(X, zz, p) //X/zz\n }\n } //end unchecked\n }\n\n\n /**\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\n * generation of contract bytecode for precomputations is done using sagemath code\n * (see sage directory, WebAuthn_precompute.sage)\n */\n\n /**\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\n * generation of contract bytecode for precomputations is done using sagemath code\n * (see sage directory, WebAuthn_precompute.sage)\n */\n\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\n internal view\n returns (bool)\n {\n uint256 r = rs[0];\n uint256 s = rs[1];\n if (r == 0 || r >= n || s == 0 || s >= n) {\n return false;\n }\n /* Q is pushed via bytecode assumed to be correct\n if (!isOnCurve(Q[0], Q[1])) {\n return false;\n }*/\n\n uint256 sInv = FCL_nModInv(s);\n uint256 X;\n\n //Shamir 8 dimensions\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\n\n assembly {\n X := addmod(X, sub(n, r), n)\n }\n return X == 0;\n } //end ecdsa_precomputed_verify()\n\n\n\n} //EOF\n" + }, + "FreshCryptoLib/FCL_Webauthn.sol": { + "content": "//********************************************************************************************/\n// ___ _ ___ _ _ _ _\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\n// | _| '_/ -_|_-< ' \\ | (__| '_| || | '_ \\ _/ _ \\ | |__| | '_ \\\n// |_||_| \\___/__/_||_| \\___|_| \\_, | .__/\\__\\___/ |____|_|_.__/\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\n///* License: This software is licensed under MIT License\n///* This Code may be reused including license and copyright notice.\n///* See LICENSE file at the root folder of the project.\n///* FILE: FCL_elliptic.sol\n///*\n///*\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\n//**************************************************************************************/\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\n// if ever used for other curve than sec256R1\n// SPDX-License-Identifier: MIT\npragma solidity >=0.8.19 <0.9.0;\n\nimport {Base64Url} from \"./utils/Base64Url.sol\";\nimport {FCL_Elliptic_ZZ} from \"./FCL_elliptic.sol\";\nimport {FCL_ecdsa} from \"./FCL_ecdsa.sol\";\n\nimport {FCL_ecdsa_utils} from \"./FCL_ecdsa_utils.sol\";\n\nlibrary FCL_WebAuthn {\n error InvalidAuthenticatorData();\n error InvalidClientData();\n error InvalidSignature();\n\n function WebAuthn_format(\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata // rs\n ) internal pure returns (bytes32 result) {\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\n {\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\n revert InvalidAuthenticatorData();\n }\n // Verify that clientData commits to the expected client challenge\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\n bytes memory challengeExtracted = new bytes(\n bytes(challengeEncoded).length\n );\n\n assembly {\n calldatacopy(\n add(challengeExtracted, 32),\n add(clientData.offset, clientChallengeDataOffset),\n mload(challengeExtracted)\n )\n }\n\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\n assembly {\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\n }\n\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\n revert InvalidClientData();\n }\n } //avoid stack full\n\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\n\n assembly {\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\n }\n\n bytes32 more = sha256(clientData);\n assembly {\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\n }\n\n return sha256(verifyData);\n }\n\n function checkSignature (\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata rs,\n uint256[2] calldata Q\n ) internal view returns (bool) {\n return checkSignature(authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs, Q[0], Q[1]);\n }\n\n function checkSignature (\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata rs,\n uint256 Qx,\n uint256 Qy\n ) internal view returns (bool) {\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\n\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\n );\n\n bool result = FCL_ecdsa_utils.ecdsa_verify(message, rs, Qx, Qy);\n\n return result;\n }\n\n function checkSignature_prec(\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata rs,\n address dataPointer\n ) internal view returns (bool) {\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\n\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\n );\n\n bool result = FCL_ecdsa.ecdsa_precomputed_verify(message, rs, dataPointer);\n\n return result;\n }\n\n //beware that this implementation will not be compliant with EOF\n function checkSignature_hackmem(\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata rs,\n uint256 dataPointer\n ) internal view returns (bool) {\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\n\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\n );\n\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\n\n return result;\n }\n}\n" + }, + "FreshCryptoLib/utils/Base64Url.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/**\n * @dev Encode (without '=' padding) \n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\n */\nlibrary Base64Url {\n /**\n * @dev Base64Url Encoding Table\n */\n string internal constant ENCODING_TABLE =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\n function encode(bytes memory data) internal pure returns (string memory) {\n if (data.length == 0) return \"\";\n\n // Load the table into memory\n string memory table = ENCODING_TABLE;\n\n string memory result = new string(4 * ((data.length + 2) / 3));\n\n // @solidity memory-safe-assembly\n assembly {\n let tablePtr := add(table, 1)\n let resultPtr := add(result, 32)\n\n for {\n let dataPtr := data\n let endPtr := add(data, mload(data))\n } lt(dataPtr, endPtr) {\n\n } {\n dataPtr := add(dataPtr, 3)\n let input := mload(dataPtr)\n\n mstore8(\n resultPtr,\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\n )\n resultPtr := add(resultPtr, 1)\n\n mstore8(\n resultPtr,\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\n )\n resultPtr := add(resultPtr, 1)\n\n mstore8(\n resultPtr,\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\n )\n resultPtr := add(resultPtr, 1)\n\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\n resultPtr := add(resultPtr, 1)\n }\n\n // Remove the padding adjustment logic\n switch mod(mload(data), 3)\n case 1 {\n // Adjust for the last byte of data\n resultPtr := sub(resultPtr, 2)\n }\n case 2 {\n // Adjust for the last two bytes of data\n resultPtr := sub(resultPtr, 1)\n }\n \n // Set the correct length of the result string\n mstore(result, sub(resultPtr, add(result, 32)))\n }\n\n return result; \n }\n}\n" + }, + "solady/src/utils/LibClone.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Minimal proxy library.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibClone.sol)\n/// @author Minimal proxy by 0age (https://github.com/0age)\n/// @author Clones with immutable args by wighawag, zefram.eth, Saw-mon & Natalie\n/// (https://github.com/Saw-mon-and-Natalie/clones-with-immutable-args)\n///\n/// @dev Minimal proxy:\n/// Although the sw0nt pattern saves 5 gas over the erc-1167 pattern during runtime,\n/// it is not supported out-of-the-box on Etherscan. Hence, we choose to use the 0age pattern,\n/// which saves 4 gas over the erc-1167 pattern during runtime, and has the smallest bytecode.\n///\n/// @dev Minimal proxy (PUSH0 variant):\n/// This is a new minimal proxy that uses the PUSH0 opcode introduced during Shanghai.\n/// It is optimized first for minimal runtime gas, then for minimal bytecode.\n/// The PUSH0 clone functions are intentionally postfixed with a jarring \"_PUSH0\" as\n/// many EVM chains may not support the PUSH0 opcode in the early months after Shanghai.\n/// Please use with caution.\n///\n/// @dev Clones with immutable args (CWIA):\n/// The implementation of CWIA here implements a `receive()` method that emits the\n/// `ReceiveETH(uint256)` event. This skips the `DELEGATECALL` when there is no calldata,\n/// enabling us to accept hard gas-capped `sends` & `transfers` for maximum backwards\n/// composability. The minimal proxy implementation does not offer this feature.\nlibrary LibClone {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CUSTOM ERRORS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Unable to deploy the clone.\n error DeploymentFailed();\n\n /// @dev The salt must start with either the zero address or the caller.\n error SaltDoesNotStartWithCaller();\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* MINIMAL PROXY OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Deploys a clone of `implementation`.\n function clone(address implementation) internal returns (address instance) {\n /// @solidity memory-safe-assembly\n assembly {\n /**\n * --------------------------------------------------------------------------+\n * CREATION (9 bytes) |\n * --------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * --------------------------------------------------------------------------|\n * 60 runSize | PUSH1 runSize | r | |\n * 3d | RETURNDATASIZE | 0 r | |\n * 81 | DUP2 | r 0 r | |\n * 60 offset | PUSH1 offset | o r 0 r | |\n * 3d | RETURNDATASIZE | 0 o r 0 r | |\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\n * f3 | RETURN | | [0..runSize): runtime code |\n * --------------------------------------------------------------------------|\n * RUNTIME (44 bytes) |\n * --------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * --------------------------------------------------------------------------|\n * |\n * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | 0 | |\n * 3d | RETURNDATASIZE | 0 0 | |\n * 3d | RETURNDATASIZE | 0 0 0 | |\n * 3d | RETURNDATASIZE | 0 0 0 0 | |\n * |\n * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds 0 0 0 0 | |\n * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | |\n * 3d | RETURNDATASIZE | 0 0 cds 0 0 0 0 | |\n * 37 | CALLDATACOPY | 0 0 0 0 | [0..cds): calldata |\n * |\n * ::: delegate call to the implementation contract :::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds 0 0 0 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | [0..cds): calldata |\n * 73 addr | PUSH20 addr | addr 0 cds 0 0 0 0 | [0..cds): calldata |\n * 5a | GAS | gas addr 0 cds 0 0 0 0 | [0..cds): calldata |\n * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata |\n * |\n * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata |\n * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata |\n * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata |\n * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata |\n * |\n * 60 0x2a | PUSH1 0x2a | 0x2a success 0 rds | [0..rds): returndata |\n * 57 | JUMPI | 0 rds | [0..rds): returndata |\n * |\n * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * fd | REVERT | | [0..rds): returndata |\n * |\n * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 5b | JUMPDEST | 0 rds | [0..rds): returndata |\n * f3 | RETURN | | [0..rds): returndata |\n * --------------------------------------------------------------------------+\n */\n\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\n mstore(0x14, implementation)\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\n instance := create(0, 0x0c, 0x35)\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x21, 0)\n }\n }\n\n /// @dev Deploys a deterministic clone of `implementation` with `salt`.\n function cloneDeterministic(address implementation, bytes32 salt)\n internal\n returns (address instance)\n {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\n mstore(0x14, implementation)\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\n instance := create2(0, 0x0c, 0x35, salt)\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x21, 0)\n }\n }\n\n /// @dev Returns the initialization code hash of the clone of `implementation`.\n /// Used for mining vanity addresses with create2crunch.\n function initCodeHash(address implementation) internal pure returns (bytes32 hash) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\n mstore(0x14, implementation)\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\n hash := keccak256(0x0c, 0x35)\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x21, 0)\n }\n }\n\n /// @dev Returns the address of the deterministic clone of `implementation`,\n /// with `salt` by `deployer`.\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\n function predictDeterministicAddress(address implementation, bytes32 salt, address deployer)\n internal\n pure\n returns (address predicted)\n {\n bytes32 hash = initCodeHash(implementation);\n predicted = predictDeterministicAddress(hash, salt, deployer);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* MINIMAL PROXY OPERATIONS (PUSH0 VARIANT) */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Deploys a PUSH0 clone of `implementation`.\n function clone_PUSH0(address implementation) internal returns (address instance) {\n /// @solidity memory-safe-assembly\n assembly {\n /**\n * --------------------------------------------------------------------------+\n * CREATION (9 bytes) |\n * --------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * --------------------------------------------------------------------------|\n * 60 runSize | PUSH1 runSize | r | |\n * 5f | PUSH0 | 0 r | |\n * 81 | DUP2 | r 0 r | |\n * 60 offset | PUSH1 offset | o r 0 r | |\n * 5f | PUSH0 | 0 o r 0 r | |\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\n * f3 | RETURN | | [0..runSize): runtime code |\n * --------------------------------------------------------------------------|\n * RUNTIME (45 bytes) |\n * --------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * --------------------------------------------------------------------------|\n * |\n * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |\n * 5f | PUSH0 | 0 | |\n * 5f | PUSH0 | 0 0 | |\n * |\n * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds 0 0 | |\n * 5f | PUSH0 | 0 cds 0 0 | |\n * 5f | PUSH0 | 0 0 cds 0 0 | |\n * 37 | CALLDATACOPY | 0 0 | [0..cds): calldata |\n * |\n * ::: delegate call to the implementation contract :::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds 0 0 | [0..cds): calldata |\n * 5f | PUSH0 | 0 cds 0 0 | [0..cds): calldata |\n * 73 addr | PUSH20 addr | addr 0 cds 0 0 | [0..cds): calldata |\n * 5a | GAS | gas addr 0 cds 0 0 | [0..cds): calldata |\n * f4 | DELEGATECALL | success | [0..cds): calldata |\n * |\n * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | rds success | [0..cds): calldata |\n * 5f | PUSH0 | 0 rds success | [0..cds): calldata |\n * 5f | PUSH0 | 0 0 rds success | [0..cds): calldata |\n * 3e | RETURNDATACOPY | success | [0..rds): returndata |\n * |\n * 60 0x29 | PUSH1 0x29 | 0x29 success | [0..rds): returndata |\n * 57 | JUMPI | | [0..rds): returndata |\n * |\n * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | rds | [0..rds): returndata |\n * 5f | PUSH0 | 0 rds | [0..rds): returndata |\n * fd | REVERT | | [0..rds): returndata |\n * |\n * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 5b | JUMPDEST | | [0..rds): returndata |\n * 3d | RETURNDATASIZE | rds | [0..rds): returndata |\n * 5f | PUSH0 | 0 rds | [0..rds): returndata |\n * f3 | RETURN | | [0..rds): returndata |\n * --------------------------------------------------------------------------+\n */\n\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\n mstore(0x14, implementation) // 20\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\n instance := create(0, 0x0e, 0x36)\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x24, 0)\n }\n }\n\n /// @dev Deploys a deterministic PUSH0 clone of `implementation` with `salt`.\n function cloneDeterministic_PUSH0(address implementation, bytes32 salt)\n internal\n returns (address instance)\n {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\n mstore(0x14, implementation) // 20\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\n instance := create2(0, 0x0e, 0x36, salt)\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x24, 0)\n }\n }\n\n /// @dev Returns the initialization code hash of the PUSH0 clone of `implementation`.\n /// Used for mining vanity addresses with create2crunch.\n function initCodeHash_PUSH0(address implementation) internal pure returns (bytes32 hash) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\n mstore(0x14, implementation) // 20\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\n hash := keccak256(0x0e, 0x36)\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x24, 0)\n }\n }\n\n /// @dev Returns the address of the deterministic PUSH0 clone of `implementation`,\n /// with `salt` by `deployer`.\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\n function predictDeterministicAddress_PUSH0(\n address implementation,\n bytes32 salt,\n address deployer\n ) internal pure returns (address predicted) {\n bytes32 hash = initCodeHash_PUSH0(implementation);\n predicted = predictDeterministicAddress(hash, salt, deployer);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CLONES WITH IMMUTABLE ARGS OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Deploys a minimal proxy with `implementation`,\n /// using immutable arguments encoded in `data`.\n ///\n /// Note: This implementation of CWIA differs from the original implementation.\n /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.\n function clone(address implementation, bytes memory data) internal returns (address instance) {\n assembly {\n // Compute the boundaries of the data and cache the memory slots around it.\n let mBefore3 := mload(sub(data, 0x60))\n let mBefore2 := mload(sub(data, 0x40))\n let mBefore1 := mload(sub(data, 0x20))\n let dataLength := mload(data)\n let dataEnd := add(add(data, 0x20), dataLength)\n let mAfter1 := mload(dataEnd)\n\n // +2 bytes for telling how much data there is appended to the call.\n let extraLength := add(dataLength, 2)\n // The `creationSize` is `extraLength + 108`\n // The `runSize` is `creationSize - 10`.\n\n /**\n * ---------------------------------------------------------------------------------------------------+\n * CREATION (10 bytes) |\n * ---------------------------------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * ---------------------------------------------------------------------------------------------------|\n * 61 runSize | PUSH2 runSize | r | |\n * 3d | RETURNDATASIZE | 0 r | |\n * 81 | DUP2 | r 0 r | |\n * 60 offset | PUSH1 offset | o r 0 r | |\n * 3d | RETURNDATASIZE | 0 o r 0 r | |\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\n * f3 | RETURN | | [0..runSize): runtime code |\n * ---------------------------------------------------------------------------------------------------|\n * RUNTIME (98 bytes + extraLength) |\n * ---------------------------------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * ---------------------------------------------------------------------------------------------------|\n * |\n * ::: if no calldata, emit event & return w/o `DELEGATECALL` ::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds | |\n * 60 0x2c | PUSH1 0x2c | 0x2c cds | |\n * 57 | JUMPI | | |\n * 34 | CALLVALUE | cv | |\n * 3d | RETURNDATASIZE | 0 cv | |\n * 52 | MSTORE | | [0..0x20): callvalue |\n * 7f sig | PUSH32 0x9e.. | sig | [0..0x20): callvalue |\n * 59 | MSIZE | 0x20 sig | [0..0x20): callvalue |\n * 3d | RETURNDATASIZE | 0 0x20 sig | [0..0x20): callvalue |\n * a1 | LOG1 | | [0..0x20): callvalue |\n * 00 | STOP | | [0..0x20): callvalue |\n * 5b | JUMPDEST | | |\n * |\n * ::: copy calldata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds | |\n * 3d | RETURNDATASIZE | 0 cds | |\n * 3d | RETURNDATASIZE | 0 0 cds | |\n * 37 | CALLDATACOPY | | [0..cds): calldata |\n * |\n * ::: keep some values in stack :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | 0 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | 0 0 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | 0 0 0 0 | [0..cds): calldata |\n * 61 extra | PUSH2 extra | e 0 0 0 0 | [0..cds): calldata |\n * |\n * ::: copy extra data to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 80 | DUP1 | e e 0 0 0 0 | [0..cds): calldata |\n * 60 0x62 | PUSH1 0x62 | 0x62 e e 0 0 0 0 | [0..cds): calldata |\n * 36 | CALLDATASIZE | cds 0x62 e e 0 0 0 0 | [0..cds): calldata |\n * 39 | CODECOPY | e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * |\n * ::: delegate call to the implementation contract ::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 01 | ADD | cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 3d | RETURNDATASIZE | 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 73 addr | PUSH20 addr | addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 5a | GAS | gas addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * |\n * ::: copy return data to memory ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData |\n * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData |\n * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata |\n * |\n * 60 0x60 | PUSH1 0x60 | 0x60 success 0 rds | [0..rds): returndata |\n * 57 | JUMPI | 0 rds | [0..rds): returndata |\n * |\n * ::: revert ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * fd | REVERT | | [0..rds): returndata |\n * |\n * ::: return ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 5b | JUMPDEST | 0 rds | [0..rds): returndata |\n * f3 | RETURN | | [0..rds): returndata |\n * ---------------------------------------------------------------------------------------------------+\n */\n // Write the bytecode before the data.\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\n // Write the address of the implementation.\n mstore(sub(data, 0x0d), implementation)\n // Write the rest of the bytecode.\n mstore(\n sub(data, 0x21),\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\n )\n // `keccak256(\"ReceiveETH(uint256)\")`\n mstore(\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\n )\n mstore(\n // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.\n // The actual EVM limit may be smaller and may change over time.\n sub(data, add(0x59, lt(extraLength, 0xff9e))),\n or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)\n )\n mstore(dataEnd, shl(0xf0, extraLength))\n\n // Create the instance.\n instance := create(0, sub(data, 0x4c), add(extraLength, 0x6c))\n\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n\n // Restore the overwritten memory surrounding `data`.\n mstore(dataEnd, mAfter1)\n mstore(data, dataLength)\n mstore(sub(data, 0x20), mBefore1)\n mstore(sub(data, 0x40), mBefore2)\n mstore(sub(data, 0x60), mBefore3)\n }\n }\n\n /// @dev Deploys a deterministic clone of `implementation`,\n /// using immutable arguments encoded in `data`, with `salt`.\n ///\n /// Note: This implementation of CWIA differs from the original implementation.\n /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.\n function cloneDeterministic(address implementation, bytes memory data, bytes32 salt)\n internal\n returns (address instance)\n {\n assembly {\n // Compute the boundaries of the data and cache the memory slots around it.\n let mBefore3 := mload(sub(data, 0x60))\n let mBefore2 := mload(sub(data, 0x40))\n let mBefore1 := mload(sub(data, 0x20))\n let dataLength := mload(data)\n let dataEnd := add(add(data, 0x20), dataLength)\n let mAfter1 := mload(dataEnd)\n\n // +2 bytes for telling how much data there is appended to the call.\n let extraLength := add(dataLength, 2)\n\n // Write the bytecode before the data.\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\n // Write the address of the implementation.\n mstore(sub(data, 0x0d), implementation)\n // Write the rest of the bytecode.\n mstore(\n sub(data, 0x21),\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\n )\n // `keccak256(\"ReceiveETH(uint256)\")`\n mstore(\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\n )\n mstore(\n // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.\n // The actual EVM limit may be smaller and may change over time.\n sub(data, add(0x59, lt(extraLength, 0xff9e))),\n or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)\n )\n mstore(dataEnd, shl(0xf0, extraLength))\n\n // Create the instance.\n instance := create2(0, sub(data, 0x4c), add(extraLength, 0x6c), salt)\n\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n\n // Restore the overwritten memory surrounding `data`.\n mstore(dataEnd, mAfter1)\n mstore(data, dataLength)\n mstore(sub(data, 0x20), mBefore1)\n mstore(sub(data, 0x40), mBefore2)\n mstore(sub(data, 0x60), mBefore3)\n }\n }\n\n /// @dev Returns the initialization code hash of the clone of `implementation`\n /// using immutable arguments encoded in `data`.\n /// Used for mining vanity addresses with create2crunch.\n function initCodeHash(address implementation, bytes memory data)\n internal\n pure\n returns (bytes32 hash)\n {\n assembly {\n // Compute the boundaries of the data and cache the memory slots around it.\n let mBefore3 := mload(sub(data, 0x60))\n let mBefore2 := mload(sub(data, 0x40))\n let mBefore1 := mload(sub(data, 0x20))\n let dataLength := mload(data)\n let dataEnd := add(add(data, 0x20), dataLength)\n let mAfter1 := mload(dataEnd)\n\n // Do a out-of-gas revert if `dataLength` is too big. 0xffff - 0x02 - 0x62 = 0xff9b.\n // The actual EVM limit may be smaller and may change over time.\n returndatacopy(returndatasize(), returndatasize(), gt(dataLength, 0xff9b))\n\n // +2 bytes for telling how much data there is appended to the call.\n let extraLength := add(dataLength, 2)\n\n // Write the bytecode before the data.\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\n // Write the address of the implementation.\n mstore(sub(data, 0x0d), implementation)\n // Write the rest of the bytecode.\n mstore(\n sub(data, 0x21),\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\n )\n // `keccak256(\"ReceiveETH(uint256)\")`\n mstore(\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\n )\n mstore(\n sub(data, 0x5a),\n or(shl(0x78, add(extraLength, 0x62)), 0x6100003d81600a3d39f336602c57343d527f)\n )\n mstore(dataEnd, shl(0xf0, extraLength))\n\n // Compute and store the bytecode hash.\n hash := keccak256(sub(data, 0x4c), add(extraLength, 0x6c))\n\n // Restore the overwritten memory surrounding `data`.\n mstore(dataEnd, mAfter1)\n mstore(data, dataLength)\n mstore(sub(data, 0x20), mBefore1)\n mstore(sub(data, 0x40), mBefore2)\n mstore(sub(data, 0x60), mBefore3)\n }\n }\n\n /// @dev Returns the address of the deterministic clone of\n /// `implementation` using immutable arguments encoded in `data`, with `salt`, by `deployer`.\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\n function predictDeterministicAddress(\n address implementation,\n bytes memory data,\n bytes32 salt,\n address deployer\n ) internal pure returns (address predicted) {\n bytes32 hash = initCodeHash(implementation, data);\n predicted = predictDeterministicAddress(hash, salt, deployer);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* OTHER OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns the address when a contract with initialization code hash,\n /// `hash`, is deployed with `salt`, by `deployer`.\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\n function predictDeterministicAddress(bytes32 hash, bytes32 salt, address deployer)\n internal\n pure\n returns (address predicted)\n {\n /// @solidity memory-safe-assembly\n assembly {\n // Compute and store the bytecode hash.\n mstore8(0x00, 0xff) // Write the prefix.\n mstore(0x35, hash)\n mstore(0x01, shl(96, deployer))\n mstore(0x15, salt)\n predicted := keccak256(0x00, 0x55)\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x35, 0)\n }\n }\n\n /// @dev Reverts if `salt` does not start with either the zero address or the caller.\n function checkStartsWithCaller(bytes32 salt) internal view {\n /// @solidity memory-safe-assembly\n assembly {\n // If the salt does not start with the zero address or the caller.\n if iszero(or(iszero(shr(96, salt)), eq(caller(), shr(96, salt)))) {\n // Store the function selector of `SaltDoesNotStartWithCaller()`.\n mstore(0x00, 0x2f634836)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n }\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000 + }, + "evmVersion": "paris", + "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/deployments/muster_staging/.chainId b/deployments/muster_staging/.chainId new file mode 100644 index 0000000..9592e7f --- /dev/null +++ b/deployments/muster_staging/.chainId @@ -0,0 +1 @@ +4078 \ No newline at end of file diff --git a/deployments/muster_staging/P256Signer.json b/deployments/muster_staging/P256Signer.json new file mode 100644 index 0000000..2097397 --- /dev/null +++ b/deployments/muster_staging/P256Signer.json @@ -0,0 +1,275 @@ +{ + "address": "0xc1EB9d816Fd772afE2D7577c4B60C8D912d57f0E", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AlreadyInitialized", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidAuthenticatorData", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidClientData", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidHash", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "initialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_hash", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "x", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "y", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x6c9c6b8c2af1d0d4d5b75b00d0d469e7966696bf6781e52d0c7eb67e74262fbc", + "receipt": { + "to": "0x1C702034b2533639f25601024565b087f8cD9391", + "from": "0xda677C8877E49Dfc31dC7e92fA7615F4Fb4047D7", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "1932429", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x57a1f38bd4dc9834f92544a0df7963fb49f7f0c33d0a2668881e80c82ad1cd52", + "transactionHash": "0x6c9c6b8c2af1d0d4d5b75b00d0d469e7966696bf6781e52d0c7eb67e74262fbc", + "logs": [], + "blockNumber": 112, + "cumulativeGasUsed": "1932429", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "c99418166b2fc7a84fdc0f742530dbd8", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidHash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y_\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_hash\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"x\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"y\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This contract is the implementation. It is meant to be used through proxy clone.\",\"kind\":\"dev\",\"methods\":{\"initialize(uint256,uint256)\":{\"details\":\"This function is only callable once and needs to be called immediately after deployment by the factory in the same transaction.\",\"params\":{\"x_\":\"The x coordinate of the public key\",\"y_\":\"The y coordinate of the public key\"}},\"isValidSignature(bytes,bytes)\":{\"details\":\"This is the old version of the function of EIP-1271 using bytes memory instead of bytes32\",\"params\":{\"_hash\":\"The hash of the data signed\",\"_signature\":\"The signature\"},\"returns\":{\"_0\":\"The EIP-1271 magic value\"}},\"isValidSignature(bytes32,bytes)\":{\"params\":{\"_hash\":\"The hash of the data signed\",\"_signature\":\"The signature\"},\"returns\":{\"_0\":\"The EIP-1271 magic value\"}}},\"title\":\"P256Signer\",\"version\":1},\"userdoc\":{\"errors\":{\"AlreadyInitialized()\":[{\"notice\":\"Error message when the contract is already initialized\"}],\"InvalidHash()\":[{\"notice\":\"Error message when the hash is invalid\"}],\"InvalidSignature()\":[{\"notice\":\"Error message when the signature is invalid\"}]},\"kind\":\"user\",\"methods\":{\"initialized()\":{\"notice\":\"Whether the contract has been initialized\"},\"isValidSignature(bytes,bytes)\":{\"notice\":\"Verifies that the signer is the owner of the secp256r1 public key.\"},\"isValidSignature(bytes32,bytes)\":{\"notice\":\"Verifies that the signer is the owner of the secp256r1 public key.\"},\"x()\":{\"notice\":\"The x coordinate of the secp256r1 public key\"},\"y()\":{\"notice\":\"The y coordinate of the secp256r1 public key\"}},\"notice\":\"A contract used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/P256Signer.sol\":\"P256Signer\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\nimport {FCL_ecdsa} from \\\"./FCL_ecdsa.sol\\\";\\n\\nimport {FCL_ecdsa_utils} from \\\"./FCL_ecdsa_utils.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n return checkSignature(authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs, Q[0], Q[1]);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 Qx,\\n uint256 Qy\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_ecdsa_utils.ecdsa_verify(message, rs, Qx, Qy);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_ecdsa.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xc2811ef6e17ea1d5509a3d3f7d5af5e56583347b36093d05530425d7c1316dd6\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_ecdsa.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_ecdsa.sol\\n///*\\n///*\\n///* DESCRIPTION: ecdsa verification implementation\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\n\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\n\\n\\nlibrary FCL_ecdsa {\\n // Set parameters for curve sec256r1.public\\n //curve order (number of points)\\n uint256 constant n = FCL_Elliptic_ZZ.n;\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key, no calldata version\\n */\\n function ecdsa_verify(bytes32 message, uint256 r, uint256 s, uint256 Qx, uint256 Qy) internal view returns (bool){\\n\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return false;\\n }\\n \\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\\n uint256 x1;\\n\\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\\n\\n x1= addmod(x1, n-r,n );\\n \\n return x1 == 0;\\n }\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\\n {\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return address(0);\\n }\\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256 r, uint256 s, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n \\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n X= addmod(X, n-r,n );\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n X= addmod(X, n-r,n );\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n}\\n\",\"keccak256\":\"0x679d2e9a655cd7e156a0cfc24de0aca88d4e0b34a8e0dfe6a599f23af092f5a2\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_ecdsa_utils.sol\":{\"content\":\"\\n//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_ecdsa.sol\\n///*\\n///*\\n///* DESCRIPTION: ecdsa verification implementation\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\n\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\n\\n\\nlibrary FCL_ecdsa_utils {\\n // Set parameters for curve sec256r1.public\\n //curve order (number of points)\\n uint256 constant n = FCL_Elliptic_ZZ.n;\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256 Qx, uint256 Qy) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return false;\\n }\\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\\n uint256 x1;\\n\\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\\n x1= addmod(x1, n-r,n );\\n \\n \\n return x1 == 0;\\n }\\n\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n return ecdsa_verify(message, rs, Q[0], Q[1]);\\n }\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\\n {\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return address(0);\\n }\\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) internal view returns(uint256 r, uint256 s)\\n {\\n r=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, FCL_Elliptic_ZZ.n); \\n s=mulmod(FCL_Elliptic_ZZ.FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n //ecdsa key derivation\\n //kpriv is private key return (x,y) coordinates of associated Pubkey\\n function ecdsa_derivKpub(uint256 kpriv) internal view returns(uint256 x, uint256 y)\\n {\\n \\n x=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, kpriv, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n y=FCL_Elliptic_ZZ.ec_Decompress(x, 1);\\n \\n if (FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(x, y, kpriv, FCL_Elliptic_ZZ.n - 1) != 0) //extract correct y value\\n {\\n y=FCL_Elliptic_ZZ.p-y;\\n } \\n\\n }\\n \\n //precomputations for 8 dimensional trick\\n function Precalc_8dim( uint256 Qx, uint256 Qy) internal view returns( uint[2][256] memory Prec)\\n {\\n \\n uint[2][8] memory Pow64_PQ; //store P, 64P, 128P, 192P, Q, 64Q, 128Q, 192Q\\n \\n //the trivial private keys 1 and -1 are forbidden\\n if(Qx==FCL_Elliptic_ZZ.gx)\\n {\\n revert();\\n }\\n Pow64_PQ[0][0]=FCL_Elliptic_ZZ.gx;\\n Pow64_PQ[0][1]=FCL_Elliptic_ZZ.gy;\\n \\n Pow64_PQ[4][0]=Qx;\\n Pow64_PQ[4][1]=Qy;\\n \\n /* raise to multiplication by 64 by 6 consecutive doubling*/\\n for(uint j=1;j<4;j++){\\n uint256 x;\\n uint256 y;\\n uint256 zz;\\n uint256 zzz;\\n \\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j-1][0], Pow64_PQ[j-1][1], 1, 1);\\n \\t(Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n (x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+3][0], Pow64_PQ[j+3][1], 1, 1);\\n \\t(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n\\n \\tfor(uint i=0;i<63;i++){\\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j][0], Pow64_PQ[j][1],1,1);\\n (Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1],1,1);\\n (Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n \\t}\\n }\\n \\n /* neutral point */\\n Prec[0][0]=0;\\n Prec[0][1]=0;\\n \\n \\t\\n for(uint i=1;i<256;i++)\\n { \\n Prec[i][0]=0;\\n Prec[i][1]=0;\\n \\n for(uint j=0;j<8;j++)\\n {\\n \\tif( (i&(1<=0.8.19 <0.9.0;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if ( ((0 == x)&&( 0 == y)) || x == p || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates. Deal with P=Q\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n if((x0==x1)&&(y0==y1)) {\\n (x0, y0, zz0, zzz0) = ecZZ_Dbl(x0, y0,1,1);\\n }\\n else{\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n }\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); \\n if((H0==0)&&(H1==0))//handling Q=-G\\n {\\n scalar_u=addmod(scalar_u, n-scalar_v, n);\\n scalar_v=0;\\n\\n }\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := mulmod(addmod(X, zz, p), addmod(X, sub(p, zz), p), p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M=3*(X-ZZ)(X+ZZ)\\n\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n\\n\\n} //EOF\\n\",\"keccak256\":\"0xa09802f3ca65d654d56260f40db449f9fbefbadb64429772e6f133ad6370eab9\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/P256Signer.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title P256Signer\\n/// @notice A contract used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This contract is the implementation. It is meant to be used through\\n/// proxy clone.\\ncontract P256Signer {\\n /// @notice The EIP-1271 magic value\\n bytes4 internal constant EIP1271_MAGICVALUE = 0x1626ba7e;\\n\\n /// @notice The old EIP-1271 magic value\\n bytes4 internal constant OLD_EIP1271_MAGICVALUE = 0x20c13b0b;\\n\\n /// @notice Whether the contract has been initialized\\n bool public initialized;\\n\\n /// @notice The x coordinate of the secp256r1 public key\\n uint256 public x;\\n\\n /// @notice The y coordinate of the secp256r1 public key\\n uint256 public y;\\n\\n /// @notice Error message when the signature is invalid\\n error InvalidSignature();\\n\\n /// @notice Error message when the hash is invalid\\n error InvalidHash();\\n\\n /// @notice Error message when the contract is already initialized\\n error AlreadyInitialized();\\n\\n constructor() {\\n initialized = true;\\n }\\n\\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\\n /// @param _hash The hash of the data signed\\n /// @param _signature The signature\\n /// @return The EIP-1271 magic value\\n function isValidSignature(bytes32 _hash, bytes calldata _signature) public view returns (bytes4) {\\n _validate(abi.encode(_hash), _signature);\\n return EIP1271_MAGICVALUE;\\n }\\n\\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\\n /// @dev This is the old version of the function of EIP-1271 using bytes\\n /// memory instead of bytes32\\n /// @param _hash The hash of the data signed\\n /// @param _signature The signature\\n /// @return The EIP-1271 magic value\\n function isValidSignature(bytes memory _hash, bytes calldata _signature) public view returns (bytes4) {\\n _validate(_hash, _signature);\\n return OLD_EIP1271_MAGICVALUE;\\n }\\n\\n struct SignatureLayout {\\n bytes authenticatorData;\\n bytes clientData;\\n uint256 challengeOffset;\\n uint256[2] rs;\\n }\\n\\n /// @notice Validates the signature\\n /// @param data The data signed\\n /// @param _signature The signature\\n function _validate(bytes memory data, bytes calldata _signature) private view {\\n bytes32 _hash = keccak256(data);\\n SignatureLayout calldata signaturePointer;\\n // This code should precalculate the offsets of variables as defined in the layout\\n // Calldata variables are represented as offsets, and, I think, length for dynamic types\\n // If the calldata is malformed (e.g., shorter than expected), this will revert with an out of bounds error\\n assembly {\\n signaturePointer := _signature.offset\\n }\\n\\n bool valid = FCL_WebAuthn.checkSignature(\\n signaturePointer.authenticatorData,\\n 0x01,\\n signaturePointer.clientData,\\n _hash,\\n signaturePointer.challengeOffset,\\n signaturePointer.rs,\\n x,\\n y\\n );\\n\\n if (!valid) revert InvalidSignature();\\n }\\n\\n /// @dev This function is only callable once and needs to be called immediately\\n /// after deployment by the factory in the same transaction.\\n /// @param x_ The x coordinate of the public key\\n /// @param y_ The y coordinate of the public key\\n function initialize(uint256 x_, uint256 y_) external {\\n if (initialized) revert AlreadyInitialized();\\n initialized = true;\\n x = x_;\\n y = y_;\\n }\\n}\\n\",\"keccak256\":\"0xfc1b006adb6ace0364918015a1aa64439374f813383bcc71290f6b37b66641e5\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506000805460ff1916600117905561204b8061002d6000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c806320c13b0b1161005057806320c13b0b146100f4578063a56dfe4a14610107578063e4a301161461011057600080fd5b80630c55699c14610077578063158ef93e146100935780631626ba7e146100b0575b600080fd5b61008060015481565b6040519081526020015b60405180910390f35b6000546100a09060ff1681565b604051901515815260200161008a565b6100c36100be366004611cb9565b610125565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161008a565b6100c3610102366004611d34565b61017c565b61008060025481565b61012361011e366004611e20565b6101b2565b005b60006101538460405160200161013d91815260200190565b6040516020818303038152906040528484610226565b507f1626ba7e000000000000000000000000000000000000000000000000000000009392505050565b6000610189848484610226565b507f20c13b0b000000000000000000000000000000000000000000000000000000009392505050565b60005460ff16156101ef576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591909155600255565b8251602084012082600061028061023d8380611e42565b7f010000000000000000000000000000000000000000000000000000000000000061026b6020870187611e42565b888860400135896060016001546002546102c1565b9050806102b9576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000806102d48c8c8c8c8c8c8c8c6102f5565b905060006102e482878787610598565b9d9c50505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a602081811061032e5761032e611ea7565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610392576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103be856040516020016103aa91815260200190565b6040516020818303038152906040526106f7565b90506000815167ffffffffffffffff8111156103dc576103dc611d05565b6040519080825280601f01601f191660200182016040528015610406576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016104309190611ed6565b604051602081830303815290604052805190602001201461047d576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061048f9050896020611f34565b67ffffffffffffffff8111156104a7576104a7611d05565b6040519080825280601f01601f1916602001820160405280156104d1576020820181803683370190505b509050888a60208301376000600288886040516104ef929190611f47565b602060405180830381855afa15801561050c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061052f9190611f57565b90508060208b018301526002826040516105499190611ed6565b602060405180830381855afa158015610566573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906105899190611f57565b9b9a5050505050505050505050565b6000833560208501358115806105ce57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b806105d7575080155b8061060257507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b15610612576000925050506106ef565b61061c8585610866565b61062b576000925050506106ef565b6000610636826109e0565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828a09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518386099050600061069689898585610a64565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325516106e3877fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611f70565b82081596505050505050505b949350505050565b6060815160000361071657505060408051602081019091526000815290565b6000604051806060016040528060408152602001611fd660409139905060006003845160026107459190611f34565b61074f9190611f83565b61075a906004611fbe565b67ffffffffffffffff81111561077257610772611d05565b6040519080825280601f01601f19166020018201604052801561079c576020820181803683370190505b509050600182016020820185865187015b80821015610808576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506107ad565b5050600386510660018114610824576002811461082f57610836565b600282039150610836565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158015610874575081155b8061089e57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806108c857507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156108d5575060006109da565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa610a5d57600080fd5b5192915050565b600080808060ff818088158015610a79575087155b15610a8d57600096505050505050506106ef565b610ad97f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d611561565b909250905081158015610aea575080155b15610b3c577fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038a089850600097505b600189841c16600189851c1660011b015b80610b6f5760018403935060018a851c1660018a861c1660011b019050610b4d565b50600189841c16600189851c1660011b01955060018603610bd1577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610be0578a96508993505b60038603610bef578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11156114b1577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610eda57877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff039750505050506114a6565b60018103610f29577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610f38578e93508d92505b60038103610f47578593508492505b89610f6057509198506001975087965094506114a69050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061129f578361129f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f080990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8160030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a860999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a87098508985050505050506114a6565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610bfe565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61152c57600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099c9b505050505050505050505050565b6000808080866115785785859350935050506115e6565b8461158a5787879350935050506115e6565b858814801561159857508487145b156115b9576115aa88886001806115ef565b929a50909850925090506115d3565b6115c888886001808a8a611879565b929a50909850925090505b6115df88888484611b3e565b9350935050505b94509492505050565b6000806000807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8760020993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82890990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff888b087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038c080960030995507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8889090893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038308870997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85840990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808885097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff0389089250945094509450949050565b6000806000808860000361189857508492508391506001905080611b31565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b6000806000611b4c84611bf3565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa610a5d57600080fd5b60008083601f840112611c8257600080fd5b50813567ffffffffffffffff811115611c9a57600080fd5b602083019150836020828501011115611cb257600080fd5b9250929050565b600080600060408486031215611cce57600080fd5b83359250602084013567ffffffffffffffff811115611cec57600080fd5b611cf886828701611c70565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060408486031215611d4957600080fd5b833567ffffffffffffffff80821115611d6157600080fd5b818601915086601f830112611d7557600080fd5b813581811115611d8757611d87611d05565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611dcd57611dcd611d05565b81604052828152896020848701011115611de657600080fd5b826020860160208301376000602084830101528097505050506020860135915080821115611e1357600080fd5b50611cf886828701611c70565b60008060408385031215611e3357600080fd5b50508035926020909101359150565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e7757600080fd5b83018035915067ffffffffffffffff821115611e9257600080fd5b602001915036819003821315611cb257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ef75760208186018101518583015201611edd565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156109da576109da611f05565b8183823760009101908152919050565b600060208284031215611f6957600080fd5b5051919050565b818103818111156109da576109da611f05565b600082611fb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820281158282048414176109da576109da611f0556fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa264697066735822122010b19bcb302b393f0f07ede9ec3810838497a4931544263dc93726e735cb3b0e64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c806320c13b0b1161005057806320c13b0b146100f4578063a56dfe4a14610107578063e4a301161461011057600080fd5b80630c55699c14610077578063158ef93e146100935780631626ba7e146100b0575b600080fd5b61008060015481565b6040519081526020015b60405180910390f35b6000546100a09060ff1681565b604051901515815260200161008a565b6100c36100be366004611cb9565b610125565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161008a565b6100c3610102366004611d34565b61017c565b61008060025481565b61012361011e366004611e20565b6101b2565b005b60006101538460405160200161013d91815260200190565b6040516020818303038152906040528484610226565b507f1626ba7e000000000000000000000000000000000000000000000000000000009392505050565b6000610189848484610226565b507f20c13b0b000000000000000000000000000000000000000000000000000000009392505050565b60005460ff16156101ef576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591909155600255565b8251602084012082600061028061023d8380611e42565b7f010000000000000000000000000000000000000000000000000000000000000061026b6020870187611e42565b888860400135896060016001546002546102c1565b9050806102b9576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b6000806102d48c8c8c8c8c8c8c8c6102f5565b905060006102e482878787610598565b9d9c50505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a602081811061032e5761032e611ea7565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610392576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006103be856040516020016103aa91815260200190565b6040516020818303038152906040526106f7565b90506000815167ffffffffffffffff8111156103dc576103dc611d05565b6040519080825280601f01601f191660200182016040528015610406576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016104309190611ed6565b604051602081830303815290604052805190602001201461047d576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061048f9050896020611f34565b67ffffffffffffffff8111156104a7576104a7611d05565b6040519080825280601f01601f1916602001820160405280156104d1576020820181803683370190505b509050888a60208301376000600288886040516104ef929190611f47565b602060405180830381855afa15801561050c573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061052f9190611f57565b90508060208b018301526002826040516105499190611ed6565b602060405180830381855afa158015610566573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906105899190611f57565b9b9a5050505050505050505050565b6000833560208501358115806105ce57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b806105d7575080155b8061060257507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b15610612576000925050506106ef565b61061c8585610866565b61062b576000925050506106ef565b6000610636826109e0565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828a09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518386099050600061069689898585610a64565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325516106e3877fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611f70565b82081596505050505050505b949350505050565b6060815160000361071657505060408051602081019091526000815290565b6000604051806060016040528060408152602001611fd660409139905060006003845160026107459190611f34565b61074f9190611f83565b61075a906004611fbe565b67ffffffffffffffff81111561077257610772611d05565b6040519080825280601f01601f19166020018201604052801561079c576020820181803683370190505b509050600182016020820185865187015b80821015610808576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506107ad565b5050600386510660018114610824576002811461082f57610836565b600282039150610836565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158015610874575081155b8061089e57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806108c857507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156108d5575060006109da565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa610a5d57600080fd5b5192915050565b600080808060ff818088158015610a79575087155b15610a8d57600096505050505050506106ef565b610ad97f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d611561565b909250905081158015610aea575080155b15610b3c577fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038a089850600097505b600189841c16600189851c1660011b015b80610b6f5760018403935060018a851c1660018a861c1660011b019050610b4d565b50600189841c16600189851c1660011b01955060018603610bd1577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610be0578a96508993505b60038603610bef578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff11156114b1577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610eda57877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff039750505050506114a6565b60018103610f29577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610f38578e93508d92505b60038103610f47578593508492505b89610f6057509198506001975087965094506114a69050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061129f578361129f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f080990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8160030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a860999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a87098508985050505050506114a6565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610bfe565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61152c57600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099c9b505050505050505050505050565b6000808080866115785785859350935050506115e6565b8461158a5787879350935050506115e6565b858814801561159857508487145b156115b9576115aa88886001806115ef565b929a50909850925090506115d3565b6115c888886001808a8a611879565b929a50909850925090505b6115df88888484611b3e565b9350935050505b94509492505050565b6000806000807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8760020993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82890990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff888b087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038c080960030995507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8889090893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038308870997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85840990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808885097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff0389089250945094509450949050565b6000806000808860000361189857508492508391506001905080611b31565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b6000806000611b4c84611bf3565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa610a5d57600080fd5b60008083601f840112611c8257600080fd5b50813567ffffffffffffffff811115611c9a57600080fd5b602083019150836020828501011115611cb257600080fd5b9250929050565b600080600060408486031215611cce57600080fd5b83359250602084013567ffffffffffffffff811115611cec57600080fd5b611cf886828701611c70565b9497909650939450505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060408486031215611d4957600080fd5b833567ffffffffffffffff80821115611d6157600080fd5b818601915086601f830112611d7557600080fd5b813581811115611d8757611d87611d05565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611dcd57611dcd611d05565b81604052828152896020848701011115611de657600080fd5b826020860160208301376000602084830101528097505050506020860135915080821115611e1357600080fd5b50611cf886828701611c70565b60008060408385031215611e3357600080fd5b50508035926020909101359150565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e7757600080fd5b83018035915067ffffffffffffffff821115611e9257600080fd5b602001915036819003821315611cb257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ef75760208186018101518583015201611edd565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156109da576109da611f05565b8183823760009101908152919050565b600060208284031215611f6957600080fd5b5051919050565b818103818111156109da576109da611f05565b600082611fb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820281158282048414176109da576109da611f0556fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa264697066735822122010b19bcb302b393f0f07ede9ec3810838497a4931544263dc93726e735cb3b0e64736f6c63430008140033", + "devdoc": { + "details": "This contract is the implementation. It is meant to be used through proxy clone.", + "kind": "dev", + "methods": { + "initialize(uint256,uint256)": { + "details": "This function is only callable once and needs to be called immediately after deployment by the factory in the same transaction.", + "params": { + "x_": "The x coordinate of the public key", + "y_": "The y coordinate of the public key" + } + }, + "isValidSignature(bytes,bytes)": { + "details": "This is the old version of the function of EIP-1271 using bytes memory instead of bytes32", + "params": { + "_hash": "The hash of the data signed", + "_signature": "The signature" + }, + "returns": { + "_0": "The EIP-1271 magic value" + } + }, + "isValidSignature(bytes32,bytes)": { + "params": { + "_hash": "The hash of the data signed", + "_signature": "The signature" + }, + "returns": { + "_0": "The EIP-1271 magic value" + } + } + }, + "title": "P256Signer", + "version": 1 + }, + "userdoc": { + "errors": { + "AlreadyInitialized()": [ + { + "notice": "Error message when the contract is already initialized" + } + ], + "InvalidHash()": [ + { + "notice": "Error message when the hash is invalid" + } + ], + "InvalidSignature()": [ + { + "notice": "Error message when the signature is invalid" + } + ] + }, + "kind": "user", + "methods": { + "initialized()": { + "notice": "Whether the contract has been initialized" + }, + "isValidSignature(bytes,bytes)": { + "notice": "Verifies that the signer is the owner of the secp256r1 public key." + }, + "isValidSignature(bytes32,bytes)": { + "notice": "Verifies that the signer is the owner of the secp256r1 public key." + }, + "x()": { + "notice": "The x coordinate of the secp256r1 public key" + }, + "y()": { + "notice": "The y coordinate of the secp256r1 public key" + } + }, + "notice": "A contract used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 2859, + "contract": "contracts/P256Signer.sol:P256Signer", + "label": "initialized", + "offset": 0, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 2862, + "contract": "contracts/P256Signer.sol:P256Signer", + "label": "x", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 2865, + "contract": "contracts/P256Signer.sol:P256Signer", + "label": "y", + "offset": 0, + "slot": "2", + "type": "t_uint256" + } + ], + "types": { + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/deployments/muster_staging/P256SignerFactory.json b/deployments/muster_staging/P256SignerFactory.json new file mode 100644 index 0000000..7df0ef0 --- /dev/null +++ b/deployments/muster_staging/P256SignerFactory.json @@ -0,0 +1,137 @@ +{ + "address": "0x2C490ff08Bcc843be4894c4Ed51Af56D34A51bf4", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "y", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "signer", + "type": "address" + } + ], + "name": "NewSignerCreated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "name": "create", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x3108ef86e9c64d612145daaba6838cc1307698efb95240628cc58aa37d8185d2", + "receipt": { + "to": "0x1C702034b2533639f25601024565b087f8cD9391", + "from": "0xda677C8877E49Dfc31dC7e92fA7615F4Fb4047D7", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "218110", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xc8c0794fad6f5277c73264c89de71fdcc6a5ce05d8187526cdef9d439e6ac374", + "transactionHash": "0x3108ef86e9c64d612145daaba6838cc1307698efb95240628cc58aa37d8185d2", + "logs": [], + "blockNumber": 113, + "cumulativeGasUsed": "218110", + "status": 1, + "byzantium": true + }, + "args": [ + "0xc1EB9d816Fd772afE2D7577c4B60C8D912d57f0E" + ], + "numDeployments": 1, + "solcInputHash": "c99418166b2fc7a84fdc0f742530dbd8", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"signer\",\"type\":\"address\"}],\"name\":\"NewSignerCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"create(uint256,uint256)\":{\"params\":{\"x\":\"The x coordinate of the public key\",\"y\":\"The y coordinate of the public key\"}}},\"title\":\"P256SignerFactory\",\"version\":1},\"userdoc\":{\"events\":{\"NewSignerCreated(uint256,uint256,address)\":{\"notice\":\"Emitted when a new P256Signer proxy contract is created\"}},\"kind\":\"user\",\"methods\":{\"create(uint256,uint256)\":{\"notice\":\"Creates a new P256Signer proxy contract\"},\"implementation()\":{\"notice\":\"The implementation address of the P256Signer contract\"}},\"notice\":\"Factory contract for creating proxies for P256Signer\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/P256SignerFactory.sol\":\"P256SignerFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\nimport {FCL_ecdsa} from \\\"./FCL_ecdsa.sol\\\";\\n\\nimport {FCL_ecdsa_utils} from \\\"./FCL_ecdsa_utils.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n return checkSignature(authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs, Q[0], Q[1]);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 Qx,\\n uint256 Qy\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_ecdsa_utils.ecdsa_verify(message, rs, Qx, Qy);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_ecdsa.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xc2811ef6e17ea1d5509a3d3f7d5af5e56583347b36093d05530425d7c1316dd6\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_ecdsa.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_ecdsa.sol\\n///*\\n///*\\n///* DESCRIPTION: ecdsa verification implementation\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\n\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\n\\n\\nlibrary FCL_ecdsa {\\n // Set parameters for curve sec256r1.public\\n //curve order (number of points)\\n uint256 constant n = FCL_Elliptic_ZZ.n;\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key, no calldata version\\n */\\n function ecdsa_verify(bytes32 message, uint256 r, uint256 s, uint256 Qx, uint256 Qy) internal view returns (bool){\\n\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return false;\\n }\\n \\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\\n uint256 x1;\\n\\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\\n\\n x1= addmod(x1, n-r,n );\\n \\n return x1 == 0;\\n }\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\\n {\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return address(0);\\n }\\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256 r, uint256 s, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n \\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n X= addmod(X, n-r,n );\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n X= addmod(X, n-r,n );\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n}\\n\",\"keccak256\":\"0x679d2e9a655cd7e156a0cfc24de0aca88d4e0b34a8e0dfe6a599f23af092f5a2\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_ecdsa_utils.sol\":{\"content\":\"\\n//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_ecdsa.sol\\n///*\\n///*\\n///* DESCRIPTION: ecdsa verification implementation\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.19 <0.9.0;\\n\\n\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\n\\n\\nlibrary FCL_ecdsa_utils {\\n // Set parameters for curve sec256r1.public\\n //curve order (number of points)\\n uint256 constant n = FCL_Elliptic_ZZ.n;\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256 Qx, uint256 Qy) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return false;\\n }\\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\\n uint256 x1;\\n\\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\\n x1= addmod(x1, n-r,n );\\n \\n \\n return x1 == 0;\\n }\\n\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n return ecdsa_verify(message, rs, Q[0], Q[1]);\\n }\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\\n {\\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\\n return address(0);\\n }\\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) internal view returns(uint256 r, uint256 s)\\n {\\n r=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, FCL_Elliptic_ZZ.n); \\n s=mulmod(FCL_Elliptic_ZZ.FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n //ecdsa key derivation\\n //kpriv is private key return (x,y) coordinates of associated Pubkey\\n function ecdsa_derivKpub(uint256 kpriv) internal view returns(uint256 x, uint256 y)\\n {\\n \\n x=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, kpriv, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n y=FCL_Elliptic_ZZ.ec_Decompress(x, 1);\\n \\n if (FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(x, y, kpriv, FCL_Elliptic_ZZ.n - 1) != 0) //extract correct y value\\n {\\n y=FCL_Elliptic_ZZ.p-y;\\n } \\n\\n }\\n \\n //precomputations for 8 dimensional trick\\n function Precalc_8dim( uint256 Qx, uint256 Qy) internal view returns( uint[2][256] memory Prec)\\n {\\n \\n uint[2][8] memory Pow64_PQ; //store P, 64P, 128P, 192P, Q, 64Q, 128Q, 192Q\\n \\n //the trivial private keys 1 and -1 are forbidden\\n if(Qx==FCL_Elliptic_ZZ.gx)\\n {\\n revert();\\n }\\n Pow64_PQ[0][0]=FCL_Elliptic_ZZ.gx;\\n Pow64_PQ[0][1]=FCL_Elliptic_ZZ.gy;\\n \\n Pow64_PQ[4][0]=Qx;\\n Pow64_PQ[4][1]=Qy;\\n \\n /* raise to multiplication by 64 by 6 consecutive doubling*/\\n for(uint j=1;j<4;j++){\\n uint256 x;\\n uint256 y;\\n uint256 zz;\\n uint256 zzz;\\n \\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j-1][0], Pow64_PQ[j-1][1], 1, 1);\\n \\t(Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n (x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+3][0], Pow64_PQ[j+3][1], 1, 1);\\n \\t(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n\\n \\tfor(uint i=0;i<63;i++){\\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j][0], Pow64_PQ[j][1],1,1);\\n (Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n \\t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1],1,1);\\n (Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\\n \\t}\\n }\\n \\n /* neutral point */\\n Prec[0][0]=0;\\n Prec[0][1]=0;\\n \\n \\t\\n for(uint i=1;i<256;i++)\\n { \\n Prec[i][0]=0;\\n Prec[i][1]=0;\\n \\n for(uint j=0;j<8;j++)\\n {\\n \\tif( (i&(1<=0.8.19 <0.9.0;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if ( ((0 == x)&&( 0 == y)) || x == p || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates. Deal with P=Q\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n if((x0==x1)&&(y0==y1)) {\\n (x0, y0, zz0, zzz0) = ecZZ_Dbl(x0, y0,1,1);\\n }\\n else{\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n }\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); \\n if((H0==0)&&(H1==0))//handling Q=-G\\n {\\n scalar_u=addmod(scalar_u, n-scalar_v, n);\\n scalar_v=0;\\n\\n }\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := mulmod(addmod(X, zz, p), addmod(X, sub(p, zz), p), p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M=3*(X-ZZ)(X+ZZ)\\n\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n\\n\\n} //EOF\\n\",\"keccak256\":\"0xa09802f3ca65d654d56260f40db449f9fbefbadb64429772e6f133ad6370eab9\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/P256Signer.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title P256Signer\\n/// @notice A contract used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This contract is the implementation. It is meant to be used through\\n/// proxy clone.\\ncontract P256Signer {\\n /// @notice The EIP-1271 magic value\\n bytes4 internal constant EIP1271_MAGICVALUE = 0x1626ba7e;\\n\\n /// @notice The old EIP-1271 magic value\\n bytes4 internal constant OLD_EIP1271_MAGICVALUE = 0x20c13b0b;\\n\\n /// @notice Whether the contract has been initialized\\n bool public initialized;\\n\\n /// @notice The x coordinate of the secp256r1 public key\\n uint256 public x;\\n\\n /// @notice The y coordinate of the secp256r1 public key\\n uint256 public y;\\n\\n /// @notice Error message when the signature is invalid\\n error InvalidSignature();\\n\\n /// @notice Error message when the hash is invalid\\n error InvalidHash();\\n\\n /// @notice Error message when the contract is already initialized\\n error AlreadyInitialized();\\n\\n constructor() {\\n initialized = true;\\n }\\n\\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\\n /// @param _hash The hash of the data signed\\n /// @param _signature The signature\\n /// @return The EIP-1271 magic value\\n function isValidSignature(bytes32 _hash, bytes calldata _signature) public view returns (bytes4) {\\n _validate(abi.encode(_hash), _signature);\\n return EIP1271_MAGICVALUE;\\n }\\n\\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\\n /// @dev This is the old version of the function of EIP-1271 using bytes\\n /// memory instead of bytes32\\n /// @param _hash The hash of the data signed\\n /// @param _signature The signature\\n /// @return The EIP-1271 magic value\\n function isValidSignature(bytes memory _hash, bytes calldata _signature) public view returns (bytes4) {\\n _validate(_hash, _signature);\\n return OLD_EIP1271_MAGICVALUE;\\n }\\n\\n struct SignatureLayout {\\n bytes authenticatorData;\\n bytes clientData;\\n uint256 challengeOffset;\\n uint256[2] rs;\\n }\\n\\n /// @notice Validates the signature\\n /// @param data The data signed\\n /// @param _signature The signature\\n function _validate(bytes memory data, bytes calldata _signature) private view {\\n bytes32 _hash = keccak256(data);\\n SignatureLayout calldata signaturePointer;\\n // This code should precalculate the offsets of variables as defined in the layout\\n // Calldata variables are represented as offsets, and, I think, length for dynamic types\\n // If the calldata is malformed (e.g., shorter than expected), this will revert with an out of bounds error\\n assembly {\\n signaturePointer := _signature.offset\\n }\\n\\n bool valid = FCL_WebAuthn.checkSignature(\\n signaturePointer.authenticatorData,\\n 0x01,\\n signaturePointer.clientData,\\n _hash,\\n signaturePointer.challengeOffset,\\n signaturePointer.rs,\\n x,\\n y\\n );\\n\\n if (!valid) revert InvalidSignature();\\n }\\n\\n /// @dev This function is only callable once and needs to be called immediately\\n /// after deployment by the factory in the same transaction.\\n /// @param x_ The x coordinate of the public key\\n /// @param y_ The y coordinate of the public key\\n function initialize(uint256 x_, uint256 y_) external {\\n if (initialized) revert AlreadyInitialized();\\n initialized = true;\\n x = x_;\\n y = y_;\\n }\\n}\\n\",\"keccak256\":\"0xfc1b006adb6ace0364918015a1aa64439374f813383bcc71290f6b37b66641e5\"},\"contracts/P256SignerFactory.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {P256Signer} from \\\"./P256Signer.sol\\\";\\nimport \\\"solady/src/utils/LibClone.sol\\\";\\n\\n/// @title P256SignerFactory\\n/// @notice Factory contract for creating proxies for P256Signer\\ncontract P256SignerFactory {\\n /// @notice The implementation address of the P256Signer contract\\n address public immutable implementation;\\n\\n constructor(address implementation_) {\\n implementation = implementation_;\\n }\\n\\n /// @notice Emitted when a new P256Signer proxy contract is created\\n event NewSignerCreated(uint256 indexed x, uint256 indexed y, address signer);\\n\\n /// @notice Creates a new P256Signer proxy contract\\n /// @param x The x coordinate of the public key\\n /// @param y The y coordinate of the public key\\n function create(uint256 x, uint256 y) external returns (address) {\\n bytes32 salt = keccak256(abi.encodePacked(x, y));\\n address signer = LibClone.cloneDeterministic(implementation, salt);\\n P256Signer(signer).initialize(x, y);\\n emit NewSignerCreated(x, y, signer);\\n return signer;\\n }\\n}\\n\",\"keccak256\":\"0x3bdac08bf7a1c4c1621474b10733f74a9487359212705bbca42ec678aa549a53\"},\"solady/src/utils/LibClone.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @notice Minimal proxy library.\\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibClone.sol)\\n/// @author Minimal proxy by 0age (https://github.com/0age)\\n/// @author Clones with immutable args by wighawag, zefram.eth, Saw-mon & Natalie\\n/// (https://github.com/Saw-mon-and-Natalie/clones-with-immutable-args)\\n///\\n/// @dev Minimal proxy:\\n/// Although the sw0nt pattern saves 5 gas over the erc-1167 pattern during runtime,\\n/// it is not supported out-of-the-box on Etherscan. Hence, we choose to use the 0age pattern,\\n/// which saves 4 gas over the erc-1167 pattern during runtime, and has the smallest bytecode.\\n///\\n/// @dev Minimal proxy (PUSH0 variant):\\n/// This is a new minimal proxy that uses the PUSH0 opcode introduced during Shanghai.\\n/// It is optimized first for minimal runtime gas, then for minimal bytecode.\\n/// The PUSH0 clone functions are intentionally postfixed with a jarring \\\"_PUSH0\\\" as\\n/// many EVM chains may not support the PUSH0 opcode in the early months after Shanghai.\\n/// Please use with caution.\\n///\\n/// @dev Clones with immutable args (CWIA):\\n/// The implementation of CWIA here implements a `receive()` method that emits the\\n/// `ReceiveETH(uint256)` event. This skips the `DELEGATECALL` when there is no calldata,\\n/// enabling us to accept hard gas-capped `sends` & `transfers` for maximum backwards\\n/// composability. The minimal proxy implementation does not offer this feature.\\nlibrary LibClone {\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CUSTOM ERRORS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Unable to deploy the clone.\\n error DeploymentFailed();\\n\\n /// @dev The salt must start with either the zero address or the caller.\\n error SaltDoesNotStartWithCaller();\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* MINIMAL PROXY OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Deploys a clone of `implementation`.\\n function clone(address implementation) internal returns (address instance) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n /**\\n * --------------------------------------------------------------------------+\\n * CREATION (9 bytes) |\\n * --------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * --------------------------------------------------------------------------|\\n * 60 runSize | PUSH1 runSize | r | |\\n * 3d | RETURNDATASIZE | 0 r | |\\n * 81 | DUP2 | r 0 r | |\\n * 60 offset | PUSH1 offset | o r 0 r | |\\n * 3d | RETURNDATASIZE | 0 o r 0 r | |\\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\\n * f3 | RETURN | | [0..runSize): runtime code |\\n * --------------------------------------------------------------------------|\\n * RUNTIME (44 bytes) |\\n * --------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * --------------------------------------------------------------------------|\\n * |\\n * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | 0 | |\\n * 3d | RETURNDATASIZE | 0 0 | |\\n * 3d | RETURNDATASIZE | 0 0 0 | |\\n * 3d | RETURNDATASIZE | 0 0 0 0 | |\\n * |\\n * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds 0 0 0 0 | |\\n * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | |\\n * 3d | RETURNDATASIZE | 0 0 cds 0 0 0 0 | |\\n * 37 | CALLDATACOPY | 0 0 0 0 | [0..cds): calldata |\\n * |\\n * ::: delegate call to the implementation contract :::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds 0 0 0 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | [0..cds): calldata |\\n * 73 addr | PUSH20 addr | addr 0 cds 0 0 0 0 | [0..cds): calldata |\\n * 5a | GAS | gas addr 0 cds 0 0 0 0 | [0..cds): calldata |\\n * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata |\\n * |\\n * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata |\\n * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata |\\n * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata |\\n * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata |\\n * |\\n * 60 0x2a | PUSH1 0x2a | 0x2a success 0 rds | [0..rds): returndata |\\n * 57 | JUMPI | 0 rds | [0..rds): returndata |\\n * |\\n * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * fd | REVERT | | [0..rds): returndata |\\n * |\\n * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 5b | JUMPDEST | 0 rds | [0..rds): returndata |\\n * f3 | RETURN | | [0..rds): returndata |\\n * --------------------------------------------------------------------------+\\n */\\n\\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\\n mstore(0x14, implementation)\\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\\n instance := create(0, 0x0c, 0x35)\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x21, 0)\\n }\\n }\\n\\n /// @dev Deploys a deterministic clone of `implementation` with `salt`.\\n function cloneDeterministic(address implementation, bytes32 salt)\\n internal\\n returns (address instance)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\\n mstore(0x14, implementation)\\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\\n instance := create2(0, 0x0c, 0x35, salt)\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x21, 0)\\n }\\n }\\n\\n /// @dev Returns the initialization code hash of the clone of `implementation`.\\n /// Used for mining vanity addresses with create2crunch.\\n function initCodeHash(address implementation) internal pure returns (bytes32 hash) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\\n mstore(0x14, implementation)\\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\\n hash := keccak256(0x0c, 0x35)\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x21, 0)\\n }\\n }\\n\\n /// @dev Returns the address of the deterministic clone of `implementation`,\\n /// with `salt` by `deployer`.\\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\\n function predictDeterministicAddress(address implementation, bytes32 salt, address deployer)\\n internal\\n pure\\n returns (address predicted)\\n {\\n bytes32 hash = initCodeHash(implementation);\\n predicted = predictDeterministicAddress(hash, salt, deployer);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* MINIMAL PROXY OPERATIONS (PUSH0 VARIANT) */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Deploys a PUSH0 clone of `implementation`.\\n function clone_PUSH0(address implementation) internal returns (address instance) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n /**\\n * --------------------------------------------------------------------------+\\n * CREATION (9 bytes) |\\n * --------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * --------------------------------------------------------------------------|\\n * 60 runSize | PUSH1 runSize | r | |\\n * 5f | PUSH0 | 0 r | |\\n * 81 | DUP2 | r 0 r | |\\n * 60 offset | PUSH1 offset | o r 0 r | |\\n * 5f | PUSH0 | 0 o r 0 r | |\\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\\n * f3 | RETURN | | [0..runSize): runtime code |\\n * --------------------------------------------------------------------------|\\n * RUNTIME (45 bytes) |\\n * --------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * --------------------------------------------------------------------------|\\n * |\\n * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |\\n * 5f | PUSH0 | 0 | |\\n * 5f | PUSH0 | 0 0 | |\\n * |\\n * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds 0 0 | |\\n * 5f | PUSH0 | 0 cds 0 0 | |\\n * 5f | PUSH0 | 0 0 cds 0 0 | |\\n * 37 | CALLDATACOPY | 0 0 | [0..cds): calldata |\\n * |\\n * ::: delegate call to the implementation contract :::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds 0 0 | [0..cds): calldata |\\n * 5f | PUSH0 | 0 cds 0 0 | [0..cds): calldata |\\n * 73 addr | PUSH20 addr | addr 0 cds 0 0 | [0..cds): calldata |\\n * 5a | GAS | gas addr 0 cds 0 0 | [0..cds): calldata |\\n * f4 | DELEGATECALL | success | [0..cds): calldata |\\n * |\\n * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | rds success | [0..cds): calldata |\\n * 5f | PUSH0 | 0 rds success | [0..cds): calldata |\\n * 5f | PUSH0 | 0 0 rds success | [0..cds): calldata |\\n * 3e | RETURNDATACOPY | success | [0..rds): returndata |\\n * |\\n * 60 0x29 | PUSH1 0x29 | 0x29 success | [0..rds): returndata |\\n * 57 | JUMPI | | [0..rds): returndata |\\n * |\\n * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | rds | [0..rds): returndata |\\n * 5f | PUSH0 | 0 rds | [0..rds): returndata |\\n * fd | REVERT | | [0..rds): returndata |\\n * |\\n * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 5b | JUMPDEST | | [0..rds): returndata |\\n * 3d | RETURNDATASIZE | rds | [0..rds): returndata |\\n * 5f | PUSH0 | 0 rds | [0..rds): returndata |\\n * f3 | RETURN | | [0..rds): returndata |\\n * --------------------------------------------------------------------------+\\n */\\n\\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\\n mstore(0x14, implementation) // 20\\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\\n instance := create(0, 0x0e, 0x36)\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x24, 0)\\n }\\n }\\n\\n /// @dev Deploys a deterministic PUSH0 clone of `implementation` with `salt`.\\n function cloneDeterministic_PUSH0(address implementation, bytes32 salt)\\n internal\\n returns (address instance)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\\n mstore(0x14, implementation) // 20\\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\\n instance := create2(0, 0x0e, 0x36, salt)\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x24, 0)\\n }\\n }\\n\\n /// @dev Returns the initialization code hash of the PUSH0 clone of `implementation`.\\n /// Used for mining vanity addresses with create2crunch.\\n function initCodeHash_PUSH0(address implementation) internal pure returns (bytes32 hash) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\\n mstore(0x14, implementation) // 20\\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\\n hash := keccak256(0x0e, 0x36)\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x24, 0)\\n }\\n }\\n\\n /// @dev Returns the address of the deterministic PUSH0 clone of `implementation`,\\n /// with `salt` by `deployer`.\\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\\n function predictDeterministicAddress_PUSH0(\\n address implementation,\\n bytes32 salt,\\n address deployer\\n ) internal pure returns (address predicted) {\\n bytes32 hash = initCodeHash_PUSH0(implementation);\\n predicted = predictDeterministicAddress(hash, salt, deployer);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* CLONES WITH IMMUTABLE ARGS OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Deploys a minimal proxy with `implementation`,\\n /// using immutable arguments encoded in `data`.\\n ///\\n /// Note: This implementation of CWIA differs from the original implementation.\\n /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.\\n function clone(address implementation, bytes memory data) internal returns (address instance) {\\n assembly {\\n // Compute the boundaries of the data and cache the memory slots around it.\\n let mBefore3 := mload(sub(data, 0x60))\\n let mBefore2 := mload(sub(data, 0x40))\\n let mBefore1 := mload(sub(data, 0x20))\\n let dataLength := mload(data)\\n let dataEnd := add(add(data, 0x20), dataLength)\\n let mAfter1 := mload(dataEnd)\\n\\n // +2 bytes for telling how much data there is appended to the call.\\n let extraLength := add(dataLength, 2)\\n // The `creationSize` is `extraLength + 108`\\n // The `runSize` is `creationSize - 10`.\\n\\n /**\\n * ---------------------------------------------------------------------------------------------------+\\n * CREATION (10 bytes) |\\n * ---------------------------------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * ---------------------------------------------------------------------------------------------------|\\n * 61 runSize | PUSH2 runSize | r | |\\n * 3d | RETURNDATASIZE | 0 r | |\\n * 81 | DUP2 | r 0 r | |\\n * 60 offset | PUSH1 offset | o r 0 r | |\\n * 3d | RETURNDATASIZE | 0 o r 0 r | |\\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\\n * f3 | RETURN | | [0..runSize): runtime code |\\n * ---------------------------------------------------------------------------------------------------|\\n * RUNTIME (98 bytes + extraLength) |\\n * ---------------------------------------------------------------------------------------------------|\\n * Opcode | Mnemonic | Stack | Memory |\\n * ---------------------------------------------------------------------------------------------------|\\n * |\\n * ::: if no calldata, emit event & return w/o `DELEGATECALL` ::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds | |\\n * 60 0x2c | PUSH1 0x2c | 0x2c cds | |\\n * 57 | JUMPI | | |\\n * 34 | CALLVALUE | cv | |\\n * 3d | RETURNDATASIZE | 0 cv | |\\n * 52 | MSTORE | | [0..0x20): callvalue |\\n * 7f sig | PUSH32 0x9e.. | sig | [0..0x20): callvalue |\\n * 59 | MSIZE | 0x20 sig | [0..0x20): callvalue |\\n * 3d | RETURNDATASIZE | 0 0x20 sig | [0..0x20): callvalue |\\n * a1 | LOG1 | | [0..0x20): callvalue |\\n * 00 | STOP | | [0..0x20): callvalue |\\n * 5b | JUMPDEST | | |\\n * |\\n * ::: copy calldata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds | |\\n * 3d | RETURNDATASIZE | 0 cds | |\\n * 3d | RETURNDATASIZE | 0 0 cds | |\\n * 37 | CALLDATACOPY | | [0..cds): calldata |\\n * |\\n * ::: keep some values in stack :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | 0 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | 0 0 0 | [0..cds): calldata |\\n * 3d | RETURNDATASIZE | 0 0 0 0 | [0..cds): calldata |\\n * 61 extra | PUSH2 extra | e 0 0 0 0 | [0..cds): calldata |\\n * |\\n * ::: copy extra data to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 80 | DUP1 | e e 0 0 0 0 | [0..cds): calldata |\\n * 60 0x62 | PUSH1 0x62 | 0x62 e e 0 0 0 0 | [0..cds): calldata |\\n * 36 | CALLDATASIZE | cds 0x62 e e 0 0 0 0 | [0..cds): calldata |\\n * 39 | CODECOPY | e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * |\\n * ::: delegate call to the implementation contract ::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 36 | CALLDATASIZE | cds e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 01 | ADD | cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 3d | RETURNDATASIZE | 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 73 addr | PUSH20 addr | addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 5a | GAS | gas addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * |\\n * ::: copy return data to memory ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\\n * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData |\\n * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData |\\n * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata |\\n * |\\n * 60 0x60 | PUSH1 0x60 | 0x60 success 0 rds | [0..rds): returndata |\\n * 57 | JUMPI | 0 rds | [0..rds): returndata |\\n * |\\n * ::: revert ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * fd | REVERT | | [0..rds): returndata |\\n * |\\n * ::: return ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\\n * 5b | JUMPDEST | 0 rds | [0..rds): returndata |\\n * f3 | RETURN | | [0..rds): returndata |\\n * ---------------------------------------------------------------------------------------------------+\\n */\\n // Write the bytecode before the data.\\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\\n // Write the address of the implementation.\\n mstore(sub(data, 0x0d), implementation)\\n // Write the rest of the bytecode.\\n mstore(\\n sub(data, 0x21),\\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\\n )\\n // `keccak256(\\\"ReceiveETH(uint256)\\\")`\\n mstore(\\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\\n )\\n mstore(\\n // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.\\n // The actual EVM limit may be smaller and may change over time.\\n sub(data, add(0x59, lt(extraLength, 0xff9e))),\\n or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)\\n )\\n mstore(dataEnd, shl(0xf0, extraLength))\\n\\n // Create the instance.\\n instance := create(0, sub(data, 0x4c), add(extraLength, 0x6c))\\n\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n\\n // Restore the overwritten memory surrounding `data`.\\n mstore(dataEnd, mAfter1)\\n mstore(data, dataLength)\\n mstore(sub(data, 0x20), mBefore1)\\n mstore(sub(data, 0x40), mBefore2)\\n mstore(sub(data, 0x60), mBefore3)\\n }\\n }\\n\\n /// @dev Deploys a deterministic clone of `implementation`,\\n /// using immutable arguments encoded in `data`, with `salt`.\\n ///\\n /// Note: This implementation of CWIA differs from the original implementation.\\n /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.\\n function cloneDeterministic(address implementation, bytes memory data, bytes32 salt)\\n internal\\n returns (address instance)\\n {\\n assembly {\\n // Compute the boundaries of the data and cache the memory slots around it.\\n let mBefore3 := mload(sub(data, 0x60))\\n let mBefore2 := mload(sub(data, 0x40))\\n let mBefore1 := mload(sub(data, 0x20))\\n let dataLength := mload(data)\\n let dataEnd := add(add(data, 0x20), dataLength)\\n let mAfter1 := mload(dataEnd)\\n\\n // +2 bytes for telling how much data there is appended to the call.\\n let extraLength := add(dataLength, 2)\\n\\n // Write the bytecode before the data.\\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\\n // Write the address of the implementation.\\n mstore(sub(data, 0x0d), implementation)\\n // Write the rest of the bytecode.\\n mstore(\\n sub(data, 0x21),\\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\\n )\\n // `keccak256(\\\"ReceiveETH(uint256)\\\")`\\n mstore(\\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\\n )\\n mstore(\\n // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.\\n // The actual EVM limit may be smaller and may change over time.\\n sub(data, add(0x59, lt(extraLength, 0xff9e))),\\n or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)\\n )\\n mstore(dataEnd, shl(0xf0, extraLength))\\n\\n // Create the instance.\\n instance := create2(0, sub(data, 0x4c), add(extraLength, 0x6c), salt)\\n\\n // If `instance` is zero, revert.\\n if iszero(instance) {\\n // Store the function selector of `DeploymentFailed()`.\\n mstore(0x00, 0x30116425)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n\\n // Restore the overwritten memory surrounding `data`.\\n mstore(dataEnd, mAfter1)\\n mstore(data, dataLength)\\n mstore(sub(data, 0x20), mBefore1)\\n mstore(sub(data, 0x40), mBefore2)\\n mstore(sub(data, 0x60), mBefore3)\\n }\\n }\\n\\n /// @dev Returns the initialization code hash of the clone of `implementation`\\n /// using immutable arguments encoded in `data`.\\n /// Used for mining vanity addresses with create2crunch.\\n function initCodeHash(address implementation, bytes memory data)\\n internal\\n pure\\n returns (bytes32 hash)\\n {\\n assembly {\\n // Compute the boundaries of the data and cache the memory slots around it.\\n let mBefore3 := mload(sub(data, 0x60))\\n let mBefore2 := mload(sub(data, 0x40))\\n let mBefore1 := mload(sub(data, 0x20))\\n let dataLength := mload(data)\\n let dataEnd := add(add(data, 0x20), dataLength)\\n let mAfter1 := mload(dataEnd)\\n\\n // Do a out-of-gas revert if `dataLength` is too big. 0xffff - 0x02 - 0x62 = 0xff9b.\\n // The actual EVM limit may be smaller and may change over time.\\n returndatacopy(returndatasize(), returndatasize(), gt(dataLength, 0xff9b))\\n\\n // +2 bytes for telling how much data there is appended to the call.\\n let extraLength := add(dataLength, 2)\\n\\n // Write the bytecode before the data.\\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\\n // Write the address of the implementation.\\n mstore(sub(data, 0x0d), implementation)\\n // Write the rest of the bytecode.\\n mstore(\\n sub(data, 0x21),\\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\\n )\\n // `keccak256(\\\"ReceiveETH(uint256)\\\")`\\n mstore(\\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\\n )\\n mstore(\\n sub(data, 0x5a),\\n or(shl(0x78, add(extraLength, 0x62)), 0x6100003d81600a3d39f336602c57343d527f)\\n )\\n mstore(dataEnd, shl(0xf0, extraLength))\\n\\n // Compute and store the bytecode hash.\\n hash := keccak256(sub(data, 0x4c), add(extraLength, 0x6c))\\n\\n // Restore the overwritten memory surrounding `data`.\\n mstore(dataEnd, mAfter1)\\n mstore(data, dataLength)\\n mstore(sub(data, 0x20), mBefore1)\\n mstore(sub(data, 0x40), mBefore2)\\n mstore(sub(data, 0x60), mBefore3)\\n }\\n }\\n\\n /// @dev Returns the address of the deterministic clone of\\n /// `implementation` using immutable arguments encoded in `data`, with `salt`, by `deployer`.\\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\\n function predictDeterministicAddress(\\n address implementation,\\n bytes memory data,\\n bytes32 salt,\\n address deployer\\n ) internal pure returns (address predicted) {\\n bytes32 hash = initCodeHash(implementation, data);\\n predicted = predictDeterministicAddress(hash, salt, deployer);\\n }\\n\\n /*\\u00b4:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0\\u2022.*\\u2022\\u00b4.*:\\u02da.\\u00b0*.\\u02da\\u2022\\u00b4.\\u00b0:\\u00b0\\u2022.\\u00b0+.*\\u2022\\u00b4.*:*/\\n /* OTHER OPERATIONS */\\n /*.\\u2022\\u00b0:\\u00b0.\\u00b4+\\u02da.*\\u00b0.\\u02da:*.\\u00b4\\u2022*.+\\u00b0.\\u2022\\u00b0:\\u00b4*.\\u00b4\\u2022*.\\u2022\\u00b0.\\u2022\\u00b0:\\u00b0.\\u00b4:\\u2022\\u02da\\u00b0.*\\u00b0.\\u02da:*.\\u00b4+\\u00b0.\\u2022*/\\n\\n /// @dev Returns the address when a contract with initialization code hash,\\n /// `hash`, is deployed with `salt`, by `deployer`.\\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\\n function predictDeterministicAddress(bytes32 hash, bytes32 salt, address deployer)\\n internal\\n pure\\n returns (address predicted)\\n {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Compute and store the bytecode hash.\\n mstore8(0x00, 0xff) // Write the prefix.\\n mstore(0x35, hash)\\n mstore(0x01, shl(96, deployer))\\n mstore(0x15, salt)\\n predicted := keccak256(0x00, 0x55)\\n // Restore the part of the free memory pointer that has been overwritten.\\n mstore(0x35, 0)\\n }\\n }\\n\\n /// @dev Reverts if `salt` does not start with either the zero address or the caller.\\n function checkStartsWithCaller(bytes32 salt) internal view {\\n /// @solidity memory-safe-assembly\\n assembly {\\n // If the salt does not start with the zero address or the caller.\\n if iszero(or(iszero(shr(96, salt)), eq(caller(), shr(96, salt)))) {\\n // Store the function selector of `SaltDoesNotStartWithCaller()`.\\n mstore(0x00, 0x2f634836)\\n // Revert with (offset, size).\\n revert(0x1c, 0x04)\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x159b64c65da9e6efe93b8df8c6bb1c7672a7511dcaba414aaa3e447f6d7065e6\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a060405234801561001057600080fd5b5060405161031a38038061031a83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b60805161028a610090600039600081816040015260d7015261028a6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80635c60da1b1461003b5780639f7b45791461008b575b600080fd5b6100627f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b610062610099366004610232565b60008083836040516020016100b8929190918252602082015260400190565b60405160208183030381529060405280519060200120905060006100fc7f0000000000000000000000000000000000000000000000000000000000000000836101db565b6040517fe4a30116000000000000000000000000000000000000000000000000000000008152600481018790526024810186905290915073ffffffffffffffffffffffffffffffffffffffff82169063e4a3011690604401600060405180830381600087803b15801561016e57600080fd5b505af1158015610182573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841681528692508791507f33b61205835e3063eb8935cac4b29d7fc333ad80d6cb11893ba4758adf8cdde19060200160405180910390a3949350505050565b60006c5af43d3d93803e602a57fd5bf36021528260145273602c3d8160093d39f33d3d3d3d363d3d37363d73600052816035600c6000f59050806102275763301164256000526004601cfd5b600060215292915050565b6000806040838503121561024557600080fd5b5050803592602090910135915056fea264697066735822122071f53aa036351be28c2415d8e5721596cc980c32c199aac9af70658e7c86902d64736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80635c60da1b1461003b5780639f7b45791461008b575b600080fd5b6100627f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b610062610099366004610232565b60008083836040516020016100b8929190918252602082015260400190565b60405160208183030381529060405280519060200120905060006100fc7f0000000000000000000000000000000000000000000000000000000000000000836101db565b6040517fe4a30116000000000000000000000000000000000000000000000000000000008152600481018790526024810186905290915073ffffffffffffffffffffffffffffffffffffffff82169063e4a3011690604401600060405180830381600087803b15801561016e57600080fd5b505af1158015610182573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841681528692508791507f33b61205835e3063eb8935cac4b29d7fc333ad80d6cb11893ba4758adf8cdde19060200160405180910390a3949350505050565b60006c5af43d3d93803e602a57fd5bf36021528260145273602c3d8160093d39f33d3d3d3d363d3d37363d73600052816035600c6000f59050806102275763301164256000526004601cfd5b600060215292915050565b6000806040838503121561024557600080fd5b5050803592602090910135915056fea264697066735822122071f53aa036351be28c2415d8e5721596cc980c32c199aac9af70658e7c86902d64736f6c63430008140033", + "devdoc": { + "kind": "dev", + "methods": { + "create(uint256,uint256)": { + "params": { + "x": "The x coordinate of the public key", + "y": "The y coordinate of the public key" + } + } + }, + "title": "P256SignerFactory", + "version": 1 + }, + "userdoc": { + "events": { + "NewSignerCreated(uint256,uint256,address)": { + "notice": "Emitted when a new P256Signer proxy contract is created" + } + }, + "kind": "user", + "methods": { + "create(uint256,uint256)": { + "notice": "Creates a new P256Signer proxy contract" + }, + "implementation()": { + "notice": "The implementation address of the P256Signer contract" + } + }, + "notice": "Factory contract for creating proxies for P256Signer", + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/deployments/muster_staging/solcInputs/c99418166b2fc7a84fdc0f742530dbd8.json b/deployments/muster_staging/solcInputs/c99418166b2fc7a84fdc0f742530dbd8.json new file mode 100644 index 0000000..fdb6b70 --- /dev/null +++ b/deployments/muster_staging/solcInputs/c99418166b2fc7a84fdc0f742530dbd8.json @@ -0,0 +1,57 @@ +{ + "language": "Solidity", + "sources": { + "contracts/P256Signer.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport {FCL_WebAuthn} from \"FreshCryptoLib/FCL_Webauthn.sol\";\n\n/// @title P256Signer\n/// @notice A contract used to verify ECDSA signatures over secp256r1 through\n/// EIP-1271 of Webauthn payloads.\n/// @dev This contract is the implementation. It is meant to be used through\n/// proxy clone.\ncontract P256Signer {\n /// @notice The EIP-1271 magic value\n bytes4 internal constant EIP1271_MAGICVALUE = 0x1626ba7e;\n\n /// @notice The old EIP-1271 magic value\n bytes4 internal constant OLD_EIP1271_MAGICVALUE = 0x20c13b0b;\n\n /// @notice Whether the contract has been initialized\n bool public initialized;\n\n /// @notice The x coordinate of the secp256r1 public key\n uint256 public x;\n\n /// @notice The y coordinate of the secp256r1 public key\n uint256 public y;\n\n /// @notice Error message when the signature is invalid\n error InvalidSignature();\n\n /// @notice Error message when the hash is invalid\n error InvalidHash();\n\n /// @notice Error message when the contract is already initialized\n error AlreadyInitialized();\n\n constructor() {\n initialized = true;\n }\n\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\n /// @param _hash The hash of the data signed\n /// @param _signature The signature\n /// @return The EIP-1271 magic value\n function isValidSignature(bytes32 _hash, bytes calldata _signature) public view returns (bytes4) {\n _validate(abi.encode(_hash), _signature);\n return EIP1271_MAGICVALUE;\n }\n\n /// @notice Verifies that the signer is the owner of the secp256r1 public key.\n /// @dev This is the old version of the function of EIP-1271 using bytes\n /// memory instead of bytes32\n /// @param _hash The hash of the data signed\n /// @param _signature The signature\n /// @return The EIP-1271 magic value\n function isValidSignature(bytes memory _hash, bytes calldata _signature) public view returns (bytes4) {\n _validate(_hash, _signature);\n return OLD_EIP1271_MAGICVALUE;\n }\n\n struct SignatureLayout {\n bytes authenticatorData;\n bytes clientData;\n uint256 challengeOffset;\n uint256[2] rs;\n }\n\n /// @notice Validates the signature\n /// @param data The data signed\n /// @param _signature The signature\n function _validate(bytes memory data, bytes calldata _signature) private view {\n bytes32 _hash = keccak256(data);\n SignatureLayout calldata signaturePointer;\n // This code should precalculate the offsets of variables as defined in the layout\n // Calldata variables are represented as offsets, and, I think, length for dynamic types\n // If the calldata is malformed (e.g., shorter than expected), this will revert with an out of bounds error\n assembly {\n signaturePointer := _signature.offset\n }\n\n bool valid = FCL_WebAuthn.checkSignature(\n signaturePointer.authenticatorData,\n 0x01,\n signaturePointer.clientData,\n _hash,\n signaturePointer.challengeOffset,\n signaturePointer.rs,\n x,\n y\n );\n\n if (!valid) revert InvalidSignature();\n }\n\n /// @dev This function is only callable once and needs to be called immediately\n /// after deployment by the factory in the same transaction.\n /// @param x_ The x coordinate of the public key\n /// @param y_ The y coordinate of the public key\n function initialize(uint256 x_, uint256 y_) external {\n if (initialized) revert AlreadyInitialized();\n initialized = true;\n x = x_;\n y = y_;\n }\n}\n" + }, + "contracts/P256SignerFactory.sol": { + "content": "pragma solidity ^0.8.0;\n\nimport {P256Signer} from \"./P256Signer.sol\";\nimport \"solady/src/utils/LibClone.sol\";\n\n/// @title P256SignerFactory\n/// @notice Factory contract for creating proxies for P256Signer\ncontract P256SignerFactory {\n /// @notice The implementation address of the P256Signer contract\n address public immutable implementation;\n\n constructor(address implementation_) {\n implementation = implementation_;\n }\n\n /// @notice Emitted when a new P256Signer proxy contract is created\n event NewSignerCreated(uint256 indexed x, uint256 indexed y, address signer);\n\n /// @notice Creates a new P256Signer proxy contract\n /// @param x The x coordinate of the public key\n /// @param y The y coordinate of the public key\n function create(uint256 x, uint256 y) external returns (address) {\n bytes32 salt = keccak256(abi.encodePacked(x, y));\n address signer = LibClone.cloneDeterministic(implementation, salt);\n P256Signer(signer).initialize(x, y);\n emit NewSignerCreated(x, y, signer);\n return signer;\n }\n}\n" + }, + "FreshCryptoLib/FCL_ecdsa_utils.sol": { + "content": "\n//********************************************************************************************/\n// ___ _ ___ _ _ _ _\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\n// | _| '_/ -_|_-< ' \\ | (__| '_| || | '_ \\ _/ _ \\ | |__| | '_ \\\n// |_||_| \\___/__/_||_| \\___|_| \\_, | .__/\\__\\___/ |____|_|_.__/\n// |__/|_|\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\n///* License: This software is licensed under MIT License\n///* This Code may be reused including license and copyright notice.\n///* See LICENSE file at the root folder of the project.\n///* FILE: FCL_ecdsa.sol\n///*\n///*\n///* DESCRIPTION: ecdsa verification implementation\n///*\n//**************************************************************************************/\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\n// if ever used for other curve than sec256R1\n// SPDX-License-Identifier: MIT\npragma solidity >=0.8.19 <0.9.0;\n\n\nimport {FCL_Elliptic_ZZ} from \"./FCL_elliptic.sol\";\n\n\n\nlibrary FCL_ecdsa_utils {\n // Set parameters for curve sec256r1.public\n //curve order (number of points)\n uint256 constant n = FCL_Elliptic_ZZ.n;\n \n /**\n * @dev ECDSA verification, given , signature, and public key.\n */\n\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256 Qx, uint256 Qy) internal view returns (bool) {\n uint256 r = rs[0];\n uint256 s = rs[1];\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return false;\n }\n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\n return false;\n }\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\n uint256 x1;\n\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\n x1= addmod(x1, n-r,n );\n \n \n return x1 == 0;\n }\n\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\n return ecdsa_verify(message, rs, Q[0], Q[1]);\n }\n\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\n {\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return address(0);\n }\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\n\n uint256 Qx;\n uint256 Qy;\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\n\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\n }\n\n\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\n //K is nonce, kpriv is private key\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) internal view returns(uint256 r, uint256 s)\n {\n r=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\n r=addmod(0,r, FCL_Elliptic_ZZ.n); \n s=mulmod(FCL_Elliptic_ZZ.FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n),FCL_Elliptic_ZZ.n);//s=k^-1.(h+r.kpriv)\n\n \n if(r==0||s==0){\n revert();\n }\n\n\n }\n\n //ecdsa key derivation\n //kpriv is private key return (x,y) coordinates of associated Pubkey\n function ecdsa_derivKpub(uint256 kpriv) internal view returns(uint256 x, uint256 y)\n {\n \n x=FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(0,0, kpriv, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\n y=FCL_Elliptic_ZZ.ec_Decompress(x, 1);\n \n if (FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(x, y, kpriv, FCL_Elliptic_ZZ.n - 1) != 0) //extract correct y value\n {\n y=FCL_Elliptic_ZZ.p-y;\n } \n\n }\n \n //precomputations for 8 dimensional trick\n function Precalc_8dim( uint256 Qx, uint256 Qy) internal view returns( uint[2][256] memory Prec)\n {\n \n uint[2][8] memory Pow64_PQ; //store P, 64P, 128P, 192P, Q, 64Q, 128Q, 192Q\n \n //the trivial private keys 1 and -1 are forbidden\n if(Qx==FCL_Elliptic_ZZ.gx)\n {\n revert();\n }\n Pow64_PQ[0][0]=FCL_Elliptic_ZZ.gx;\n Pow64_PQ[0][1]=FCL_Elliptic_ZZ.gy;\n \n Pow64_PQ[4][0]=Qx;\n Pow64_PQ[4][1]=Qy;\n \n /* raise to multiplication by 64 by 6 consecutive doubling*/\n for(uint j=1;j<4;j++){\n uint256 x;\n uint256 y;\n uint256 zz;\n uint256 zzz;\n \n \t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j-1][0], Pow64_PQ[j-1][1], 1, 1);\n \t(Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\n (x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+3][0], Pow64_PQ[j+3][1], 1, 1);\n \t(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\n\n \tfor(uint i=0;i<63;i++){\n \t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j][0], Pow64_PQ[j][1],1,1);\n (Pow64_PQ[j][0], Pow64_PQ[j][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\n \t(x,y,zz,zzz)=FCL_Elliptic_ZZ.ecZZ_Dbl(Pow64_PQ[j+4][0], Pow64_PQ[j+4][1],1,1);\n (Pow64_PQ[j+4][0], Pow64_PQ[j+4][1])=FCL_Elliptic_ZZ.ecZZ_SetAff(x,y,zz,zzz);\n \t}\n }\n \n /* neutral point */\n Prec[0][0]=0;\n Prec[0][1]=0;\n \n \t\n for(uint i=1;i<256;i++)\n { \n Prec[i][0]=0;\n Prec[i][1]=0;\n \n for(uint j=0;j<8;j++)\n {\n \tif( (i&(1<=0.8.19 <0.9.0;\n\n\nimport {FCL_Elliptic_ZZ} from \"./FCL_elliptic.sol\";\n\n\n\nlibrary FCL_ecdsa {\n // Set parameters for curve sec256r1.public\n //curve order (number of points)\n uint256 constant n = FCL_Elliptic_ZZ.n;\n \n /**\n * @dev ECDSA verification, given , signature, and public key.\n */\n\n /**\n * @dev ECDSA verification, given , signature, and public key, no calldata version\n */\n function ecdsa_verify(bytes32 message, uint256 r, uint256 s, uint256 Qx, uint256 Qy) internal view returns (bool){\n\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return false;\n }\n \n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\n return false;\n }\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\n uint256 x1;\n\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\n\n x1= addmod(x1, n-r,n );\n \n return x1 == 0;\n }\n\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\n {\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return address(0);\n }\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\n\n uint256 Qx;\n uint256 Qy;\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\n\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\n }\n\n function ecdsa_precomputed_verify(bytes32 message, uint256 r, uint256 s, address Shamir8)\n internal view\n returns (bool)\n {\n \n if (r == 0 || r >= n || s == 0 || s >= n) {\n return false;\n }\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\n if (!isOnCurve(Q[0], Q[1])) {\n return false;\n }*/\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 X;\n\n //Shamir 8 dimensions\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\n\n X= addmod(X, n-r,n );\n\n return X == 0;\n } //end ecdsa_precomputed_verify()\n\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\n internal view\n returns (bool)\n {\n uint256 r = rs[0];\n uint256 s = rs[1];\n if (r == 0 || r >= n || s == 0 || s >= n) {\n return false;\n }\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\n if (!isOnCurve(Q[0], Q[1])) {\n return false;\n }*/\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 X;\n\n //Shamir 8 dimensions\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\n\n X= addmod(X, n-r,n );\n\n return X == 0;\n } //end ecdsa_precomputed_verify()\n\n}\n" + }, + "FreshCryptoLib/FCL_elliptic.sol": { + "content": "//********************************************************************************************/\n// ___ _ ___ _ _ _ _\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\n// | _| '_/ -_|_-< ' \\ | (__| '_| || | '_ \\ _/ _ \\ | |__| | '_ \\\n// |_||_| \\___/__/_||_| \\___|_| \\_, | .__/\\__\\___/ |____|_|_.__/\n// |__/|_|\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\n///* License: This software is licensed under MIT License\n///* This Code may be reused including license and copyright notice.\n///* See LICENSE file at the root folder of the project.\n///* FILE: FCL_elliptic.sol\n///*\n///*\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\n///* optimization\n///*\n//**************************************************************************************/\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\n// if ever used for other curve than sec256R1\n// SPDX-License-Identifier: MIT\npragma solidity >=0.8.19 <0.9.0;\n\nlibrary FCL_Elliptic_ZZ {\n // Set parameters for curve sec256r1.\n\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\n //curve prime field modulus\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n //short weierstrass first coefficient\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\n //short weierstrass second coefficient\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\n //generating point affine coordinates\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\n //curve order (number of points)\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\n /* -2 mod n constant, used to speed up inversion*/\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\n\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\n //P+1 div 4\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\n //arbitrary constant to express no quadratic residuosity\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n\n /**\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\n */\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\n assembly {\n let pointer := mload(0x40)\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(pointer, 0x20)\n mstore(add(pointer, 0x20), 0x20)\n mstore(add(pointer, 0x40), 0x20)\n // Define variables base, exponent and modulus\n mstore(add(pointer, 0x60), u)\n mstore(add(pointer, 0x80), minus_2modn)\n mstore(add(pointer, 0xa0), n)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\n result := mload(pointer)\n }\n }\n /**\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\n */\n\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\n assembly {\n let pointer := mload(0x40)\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(pointer, 0x20)\n mstore(add(pointer, 0x20), 0x20)\n mstore(add(pointer, 0x40), 0x20)\n // Define variables base, exponent and modulus\n mstore(add(pointer, 0x60), u)\n mstore(add(pointer, 0x80), minus_2)\n mstore(add(pointer, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\n result := mload(pointer)\n }\n }\n\n //Coron projective shuffling, take as input alpha as blinding factor\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\n {\n \n uint256 alpha2=mulmod(alpha,alpha,p);\n \n x3=mulmod(alpha2, x,p); //alpha^-2.x\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\n\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\n \n return (x3, y3, zz3, zzz3);\n }\n\n\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\n {\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\n u2=addmod(u2, p-u1, p);// P = U2-U1\n x1=mulmod(u2, u2, p);//PP\n x2=mulmod(x1, u2, p);//PPP\n \n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\n\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\n\n return (x3, y3, zz3, zzz3);\n }\n\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\n/// @param self The integer of which to find the modular inverse\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\n\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\n assembly (\"memory-safe\") {\n // load the free memory pointer value\n let pointer := mload(0x40)\n\n // Define length of base (Bsize)\n mstore(pointer, 0x20)\n // Define the exponent size (Esize)\n mstore(add(pointer, 0x20), 0x20)\n // Define the modulus size (Msize)\n mstore(add(pointer, 0x40), 0x20)\n // Define variables base (B)\n mstore(add(pointer, 0x60), self)\n // Define the exponent (E)\n mstore(add(pointer, 0x80), pp1div4)\n // We save the point of the last argument, it will be override by the result\n // of the precompile call in order to avoid paying for the memory expansion properly\n let _result := add(pointer, 0xa0)\n // Define the modulus (M)\n mstore(_result, p)\n\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\n if iszero(\n staticcall(\n not(0), // amount of gas to send\n MODEXP_PRECOMPILE, // target\n pointer, // argsOffset\n 0xc0, // argsSize (6 * 32 bytes)\n _result, // retOffset (we override M to avoid paying for the memory expansion)\n 0x20 // retSize (32 bytes)\n )\n ) { revert(0, 0) }\n\n result := mload(_result)\n// result :=addmod(result,0,p)\n }\n if(mulmod(result,result,p)!=self){\n result=_NOTSQUARE;\n }\n \n return result;\n}\n /**\n * /* @dev Convert from affine rep to XYZZ rep\n */\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\n unchecked {\n P[2] = 1; //ZZ\n P[3] = 1; //ZZZ\n P[0] = x0;\n P[1] = y0;\n }\n }\n\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \n\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\n\n y=SqrtMod(y2);\n if(y==_NOTSQUARE){\n return _NOTONCURVE;\n }\n if((y&1)!=(parity&1)){\n y=p-y;\n }\n }\n\n /**\n * /* @dev Convert from XYZZ rep to affine rep\n */\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\n y1 = mulmod(y, zzzInv, p); //Y/zzz\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\n zzzInv = mulmod(_b, _b, p); //1/zz\n x1 = mulmod(x, zzzInv, p); //X/zz\n }\n\n /**\n * /* @dev Sutherland2008 doubling\n */\n /* The \"dbl-2008-s-1\" doubling formulas */\n\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\n internal\n pure\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\n {\n unchecked {\n assembly {\n P0 := mulmod(2, y, p) //U = 2*Y1\n P2 := mulmod(P0, P0, p) // V=U^2\n P3 := mulmod(x, P2, p) // S = X1*V\n P1 := mulmod(P0, P2, p) // W=UV\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\n }\n }\n return (P0, P1, P2, P3);\n }\n\n /**\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\n */\n\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\n internal\n pure\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\n {\n unchecked {\n if (y1 == 0) {\n return (x2, y2, 1, 1);\n }\n\n assembly {\n y1 := sub(p, y1)\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\n P0 := mulmod(x2, x2, p) //PP = P^2\n P1 := mulmod(P0, x2, p) //PPP = P*PP\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\n }\n //end assembly\n } //end unchecked\n return (P0, P1, P2, P3);\n }\n\n /**\n * @dev Return the zero curve in XYZZ coordinates.\n */\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\n return (0, 0, 0, 0);\n }\n /**\n * @dev Check if point is the neutral of the curve\n */\n\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\n return y0 == 0;\n }\n /**\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\n */\n\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\n return (0, 0);\n }\n\n /**\n * @dev Check if the curve is the zero curve in affine rep.\n */\n // uint256 x, uint256 y)\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\n return (y == 0);\n }\n\n /**\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\n */\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\n if ( ((0 == x)&&( 0 == y)) || x == p || y == p) {\n return false;\n }\n unchecked {\n uint256 LHS = mulmod(y, y, p); // y^2\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\n\n return LHS == RHS;\n }\n }\n\n /**\n * @dev Add two elliptic curve points in affine coordinates. Deal with P=Q\n */\n\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\n uint256 zz0;\n uint256 zzz0;\n\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\n if((x0==x1)&&(y0==y1)) {\n (x0, y0, zz0, zzz0) = ecZZ_Dbl(x0, y0,1,1);\n }\n else{\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\n }\n\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\n }\n\n /**\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\n * Returns only x for ECDSA use \n * */\n function ecZZ_mulmuladd_S_asm(\n uint256 Q0,\n uint256 Q1, //affine rep for input point Q\n uint256 scalar_u,\n uint256 scalar_v\n ) internal view returns (uint256 X) {\n uint256 zz;\n uint256 zzz;\n uint256 Y;\n uint256 index = 255;\n uint256 H0;\n uint256 H1;\n\n unchecked {\n if (scalar_u == 0 && scalar_v == 0) return 0;\n\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); \n if((H0==0)&&(H1==0))//handling Q=-G\n {\n scalar_u=addmod(scalar_u, n-scalar_v, n);\n scalar_v=0;\n\n }\n assembly {\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\n index := sub(index, 1)\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n } {}\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if eq(zz, 1) {\n X := gx\n Y := gy\n }\n if eq(zz, 2) {\n X := Q0\n Y := Q1\n }\n if eq(zz, 3) {\n X := H0\n Y := H1\n }\n\n index := sub(index, 1)\n zz := 1\n zzz := 1\n\n for {} gt(minus_1, index) { index := sub(index, 1) } {\n // inlined EcZZ_Dbl\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n T1 := mulmod(T1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n {\n //value of dibit\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if iszero(T4) {\n Y := sub(p, Y) //restore the -Y inversion\n continue\n } // if T4!=0\n\n if eq(T4, 1) {\n T1 := gx\n T2 := gy\n }\n if eq(T4, 2) {\n T1 := Q0\n T2 := Q1\n }\n if eq(T4, 3) {\n T1 := H0\n T2 := H1\n }\n if iszero(zz) {\n X := T1\n Y := T2\n zz := 1\n zzz := 1\n continue\n }\n // inlined EcZZ_AddN\n\n //T3:=sub(p, Y)\n //T3:=Y\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\n\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\n //todo : construct edge vector case\n if iszero(y2) {\n if iszero(T2) {\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\n T2 := mulmod(T1, T1, p) // V=U^2\n T3 := mulmod(X, T2, p) // S = X1*V\n\n T1 := mulmod(T1, T2, p) // W=UV\n y2 := mulmod(addmod(X, zz, p), addmod(X, sub(p, zz), p), p) //(X-ZZ)(X+ZZ)\n T4 := mulmod(3, y2, p) //M=3*(X-ZZ)(X+ZZ)\n\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\n\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\n\n continue\n }\n }\n\n T4 := mulmod(T2, T2, p) //PP\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\n zz := mulmod(zz, T4, p)\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\n let TT2 := mulmod(X, T4, p)\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\n\n X := T4\n }\n } //end loop\n let T := mload(0x40)\n mstore(add(T, 0x60), zz)\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n //Y:=mulmod(Y,zzz,p)//Y/zzz\n //zz :=mulmod(zz, mload(T),p) //1/z\n //zz:= mulmod(zz,zz,p) //1/zz\n X := mulmod(X, mload(T), p) //X/zz\n } //end assembly\n } //end unchecked\n\n return X;\n }\n\n\n /**\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\n * Returns affine representation of point (normalized) \n * */\n function ecZZ_mulmuladd(\n uint256 Q0,\n uint256 Q1, //affine rep for input point Q\n uint256 scalar_u,\n uint256 scalar_v\n ) internal view returns (uint256 X, uint256 Y) {\n uint256 zz;\n uint256 zzz;\n uint256 index = 255;\n uint256[6] memory T;\n uint256[2] memory H;\n \n unchecked {\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\n\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\n\n assembly {\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\n index := sub(index, 1)\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n } {}\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if eq(zz, 1) {\n X := gx\n Y := gy\n }\n if eq(zz, 2) {\n X := Q0\n Y := Q1\n }\n if eq(zz, 3) {\n Y := mload(add(H,32))\n X := mload(H)\n }\n\n index := sub(index, 1)\n zz := 1\n zzz := 1\n\n for {} gt(minus_1, index) { index := sub(index, 1) } {\n // inlined EcZZ_Dbl\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n T1 := mulmod(T1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n {\n //value of dibit\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if iszero(T4) {\n Y := sub(p, Y) //restore the -Y inversion\n continue\n } // if T4!=0\n\n if eq(T4, 1) {\n T1 := gx\n T2 := gy\n }\n if eq(T4, 2) {\n T1 := Q0\n T2 := Q1\n }\n if eq(T4, 3) {\n T1 := mload(H)\n T2 := mload(add(H,32))\n }\n if iszero(zz) {\n X := T1\n Y := T2\n zz := 1\n zzz := 1\n continue\n }\n // inlined EcZZ_AddN\n\n //T3:=sub(p, Y)\n //T3:=Y\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\n\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\n //todo : construct edge vector case\n if iszero(y2) {\n if iszero(T2) {\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\n T2 := mulmod(T1, T1, p) // V=U^2\n T3 := mulmod(X, T2, p) // S = X1*V\n\n T1 := mulmod(T1, T2, p) // W=UV\n y2 := addmod(X, zz, p) //X+ZZ\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\n T4 := mulmod(3, y2, p) //M\n\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\n\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\n\n continue\n }\n }\n\n T4 := mulmod(T2, T2, p) //PP\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\n zz := mulmod(zz, T4, p)\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\n let TT2 := mulmod(X, T4, p)\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\n\n X := T4\n }\n } //end loop\n mstore(add(T, 0x60), zzz)\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n Y:=mulmod(Y,mload(T),p)//Y/zzz\n zz :=mulmod(zz, mload(T),p) //1/z\n zz:= mulmod(zz,zz,p) //1/zz\n X := mulmod(X, zz, p) //X/zz\n } //end assembly\n } //end unchecked\n\n return (X,Y);\n }\n\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\n //contract at given address dataPointer\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\n // the external tool to generate tables from public key is in the /sage directory\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\n internal view\n returns (uint256 X /*, uint Y*/ )\n {\n unchecked {\n uint256 zz; // third and coordinates of the point\n\n uint256[6] memory T;\n zz = 256; //start index\n\n while (T[0] == 0) {\n zz = zz - 1;\n //tbd case of msb octobit is null\n T[0] = 64\n * (\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\n );\n }\n assembly {\n extcodecopy(dataPointer, T, mload(T), 64)\n let index := sub(zz, 1)\n X := mload(T)\n let Y := mload(add(T, 32))\n let zzz := 1\n zz := 1\n\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\n for {} gt(index, 191) { index := add(index, 191) } {\n //inline Double\n {\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(TT1, TT1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n let T1 := mulmod(TT1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n /* compute element to access in precomputed table */\n }\n {\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\n let index2 := sub(index, 64)\n let T3 :=\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\n let index3 := sub(index2, 64)\n let T2 :=\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\n index := sub(index3, 64)\n let T1 :=\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\n\n //tbd: check validity of formulae with (0,1) to remove conditional jump\n if iszero(T1) {\n Y := sub(p, Y)\n\n continue\n }\n extcodecopy(dataPointer, T, T1, 64)\n }\n\n {\n /* Access to precomputed table using extcodecopy hack */\n\n // inlined EcZZ_AddN\n if iszero(zz) {\n X := mload(T)\n Y := mload(add(T, 32))\n zz := 1\n zzz := 1\n\n continue\n }\n\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\n\n //special case ecAdd(P,P)=EcDbl\n if iszero(y2) {\n if iszero(T2) {\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\n T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n\n T1 := mulmod(T1, T2, p) // W=UV\n y2 := addmod(X, zz, p) //X+ZZ\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\n let T4 := mulmod(3, y2, p) //M\n\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\n\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\n\n continue\n }\n }\n\n let T4 := mulmod(T2, T2, p)\n let T1 := mulmod(T4, T2, p) //\n zz := mulmod(zz, T4, p)\n //zzz3=V*ZZ1\n zzz := mulmod(zzz, T1, p) // W=UV/\n let zz1 := mulmod(X, T4, p)\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\n }\n } //end loop\n mstore(add(T, 0x60), zz)\n\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n zz := mload(T)\n X := mulmod(X, zz, p) //X/zz\n }\n } //end unchecked\n }\n\n \n\n // improving the extcodecopy trick : append array at end of contract\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\n internal view\n returns (uint256 X /*, uint Y*/ )\n {\n uint256 zz; // third and coordinates of the point\n\n uint256[6] memory T;\n zz = 256; //start index\n\n unchecked {\n while (T[0] == 0) {\n zz = zz - 1;\n //tbd case of msb octobit is null\n T[0] = 64\n * (\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\n );\n }\n assembly {\n codecopy(T, add(mload(T), dataPointer), 64)\n X := mload(T)\n let Y := mload(add(T, 32))\n let zzz := 1\n zz := 1\n\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n T1 := mulmod(T1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n /* compute element to access in precomputed table */\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\n index := sub(index, 64)\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\n index := sub(index, 64)\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\n index := sub(index, 64)\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\n //index:=add(index,192), restore index, interleaved with loop\n\n //tbd: check validity of formulae with (0,1) to remove conditional jump\n if iszero(T4) {\n Y := sub(p, Y)\n\n continue\n }\n {\n /* Access to precomputed table using extcodecopy hack */\n codecopy(T, add(T4, dataPointer), 64)\n\n // inlined EcZZ_AddN\n\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\n T4 := mulmod(T2, T2, p)\n T1 := mulmod(T4, T2, p)\n T2 := mulmod(zz, T4, p) // W=UV\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\n let zz1 := mulmod(X, T4, p)\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\n zz := T2\n X := T4\n }\n } //end loop\n mstore(add(T, 0x60), zz)\n\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n zz := mload(T)\n X := mulmod(X, zz, p) //X/zz\n }\n } //end unchecked\n }\n\n\n /**\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\n * generation of contract bytecode for precomputations is done using sagemath code\n * (see sage directory, WebAuthn_precompute.sage)\n */\n\n /**\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\n * generation of contract bytecode for precomputations is done using sagemath code\n * (see sage directory, WebAuthn_precompute.sage)\n */\n\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\n internal view\n returns (bool)\n {\n uint256 r = rs[0];\n uint256 s = rs[1];\n if (r == 0 || r >= n || s == 0 || s >= n) {\n return false;\n }\n /* Q is pushed via bytecode assumed to be correct\n if (!isOnCurve(Q[0], Q[1])) {\n return false;\n }*/\n\n uint256 sInv = FCL_nModInv(s);\n uint256 X;\n\n //Shamir 8 dimensions\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\n\n assembly {\n X := addmod(X, sub(n, r), n)\n }\n return X == 0;\n } //end ecdsa_precomputed_verify()\n\n\n\n} //EOF\n" + }, + "FreshCryptoLib/FCL_Webauthn.sol": { + "content": "//********************************************************************************************/\n// ___ _ ___ _ _ _ _\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\n// | _| '_/ -_|_-< ' \\ | (__| '_| || | '_ \\ _/ _ \\ | |__| | '_ \\\n// |_||_| \\___/__/_||_| \\___|_| \\_, | .__/\\__\\___/ |____|_|_.__/\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\n///* License: This software is licensed under MIT License\n///* This Code may be reused including license and copyright notice.\n///* See LICENSE file at the root folder of the project.\n///* FILE: FCL_elliptic.sol\n///*\n///*\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\n//**************************************************************************************/\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\n// if ever used for other curve than sec256R1\n// SPDX-License-Identifier: MIT\npragma solidity >=0.8.19 <0.9.0;\n\nimport {Base64Url} from \"./utils/Base64Url.sol\";\nimport {FCL_Elliptic_ZZ} from \"./FCL_elliptic.sol\";\nimport {FCL_ecdsa} from \"./FCL_ecdsa.sol\";\n\nimport {FCL_ecdsa_utils} from \"./FCL_ecdsa_utils.sol\";\n\nlibrary FCL_WebAuthn {\n error InvalidAuthenticatorData();\n error InvalidClientData();\n error InvalidSignature();\n\n function WebAuthn_format(\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata // rs\n ) internal pure returns (bytes32 result) {\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\n {\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\n revert InvalidAuthenticatorData();\n }\n // Verify that clientData commits to the expected client challenge\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\n bytes memory challengeExtracted = new bytes(\n bytes(challengeEncoded).length\n );\n\n assembly {\n calldatacopy(\n add(challengeExtracted, 32),\n add(clientData.offset, clientChallengeDataOffset),\n mload(challengeExtracted)\n )\n }\n\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\n assembly {\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\n }\n\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\n revert InvalidClientData();\n }\n } //avoid stack full\n\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\n\n assembly {\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\n }\n\n bytes32 more = sha256(clientData);\n assembly {\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\n }\n\n return sha256(verifyData);\n }\n\n function checkSignature (\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata rs,\n uint256[2] calldata Q\n ) internal view returns (bool) {\n return checkSignature(authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs, Q[0], Q[1]);\n }\n\n function checkSignature (\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata rs,\n uint256 Qx,\n uint256 Qy\n ) internal view returns (bool) {\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\n\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\n );\n\n bool result = FCL_ecdsa_utils.ecdsa_verify(message, rs, Qx, Qy);\n\n return result;\n }\n\n function checkSignature_prec(\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata rs,\n address dataPointer\n ) internal view returns (bool) {\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\n\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\n );\n\n bool result = FCL_ecdsa.ecdsa_precomputed_verify(message, rs, dataPointer);\n\n return result;\n }\n\n //beware that this implementation will not be compliant with EOF\n function checkSignature_hackmem(\n bytes calldata authenticatorData,\n bytes1 authenticatorDataFlagMask,\n bytes calldata clientData,\n bytes32 clientChallenge,\n uint256 clientChallengeDataOffset,\n uint256[2] calldata rs,\n uint256 dataPointer\n ) internal view returns (bool) {\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\n\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\n );\n\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\n\n return result;\n }\n}\n" + }, + "FreshCryptoLib/utils/Base64Url.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/**\n * @dev Encode (without '=' padding) \n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\n */\nlibrary Base64Url {\n /**\n * @dev Base64Url Encoding Table\n */\n string internal constant ENCODING_TABLE =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\n function encode(bytes memory data) internal pure returns (string memory) {\n if (data.length == 0) return \"\";\n\n // Load the table into memory\n string memory table = ENCODING_TABLE;\n\n string memory result = new string(4 * ((data.length + 2) / 3));\n\n // @solidity memory-safe-assembly\n assembly {\n let tablePtr := add(table, 1)\n let resultPtr := add(result, 32)\n\n for {\n let dataPtr := data\n let endPtr := add(data, mload(data))\n } lt(dataPtr, endPtr) {\n\n } {\n dataPtr := add(dataPtr, 3)\n let input := mload(dataPtr)\n\n mstore8(\n resultPtr,\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\n )\n resultPtr := add(resultPtr, 1)\n\n mstore8(\n resultPtr,\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\n )\n resultPtr := add(resultPtr, 1)\n\n mstore8(\n resultPtr,\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\n )\n resultPtr := add(resultPtr, 1)\n\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\n resultPtr := add(resultPtr, 1)\n }\n\n // Remove the padding adjustment logic\n switch mod(mload(data), 3)\n case 1 {\n // Adjust for the last byte of data\n resultPtr := sub(resultPtr, 2)\n }\n case 2 {\n // Adjust for the last two bytes of data\n resultPtr := sub(resultPtr, 1)\n }\n \n // Set the correct length of the result string\n mstore(result, sub(resultPtr, add(result, 32)))\n }\n\n return result; \n }\n}\n" + }, + "solady/src/utils/LibClone.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/// @notice Minimal proxy library.\n/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibClone.sol)\n/// @author Minimal proxy by 0age (https://github.com/0age)\n/// @author Clones with immutable args by wighawag, zefram.eth, Saw-mon & Natalie\n/// (https://github.com/Saw-mon-and-Natalie/clones-with-immutable-args)\n///\n/// @dev Minimal proxy:\n/// Although the sw0nt pattern saves 5 gas over the erc-1167 pattern during runtime,\n/// it is not supported out-of-the-box on Etherscan. Hence, we choose to use the 0age pattern,\n/// which saves 4 gas over the erc-1167 pattern during runtime, and has the smallest bytecode.\n///\n/// @dev Minimal proxy (PUSH0 variant):\n/// This is a new minimal proxy that uses the PUSH0 opcode introduced during Shanghai.\n/// It is optimized first for minimal runtime gas, then for minimal bytecode.\n/// The PUSH0 clone functions are intentionally postfixed with a jarring \"_PUSH0\" as\n/// many EVM chains may not support the PUSH0 opcode in the early months after Shanghai.\n/// Please use with caution.\n///\n/// @dev Clones with immutable args (CWIA):\n/// The implementation of CWIA here implements a `receive()` method that emits the\n/// `ReceiveETH(uint256)` event. This skips the `DELEGATECALL` when there is no calldata,\n/// enabling us to accept hard gas-capped `sends` & `transfers` for maximum backwards\n/// composability. The minimal proxy implementation does not offer this feature.\nlibrary LibClone {\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CUSTOM ERRORS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Unable to deploy the clone.\n error DeploymentFailed();\n\n /// @dev The salt must start with either the zero address or the caller.\n error SaltDoesNotStartWithCaller();\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* MINIMAL PROXY OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Deploys a clone of `implementation`.\n function clone(address implementation) internal returns (address instance) {\n /// @solidity memory-safe-assembly\n assembly {\n /**\n * --------------------------------------------------------------------------+\n * CREATION (9 bytes) |\n * --------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * --------------------------------------------------------------------------|\n * 60 runSize | PUSH1 runSize | r | |\n * 3d | RETURNDATASIZE | 0 r | |\n * 81 | DUP2 | r 0 r | |\n * 60 offset | PUSH1 offset | o r 0 r | |\n * 3d | RETURNDATASIZE | 0 o r 0 r | |\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\n * f3 | RETURN | | [0..runSize): runtime code |\n * --------------------------------------------------------------------------|\n * RUNTIME (44 bytes) |\n * --------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * --------------------------------------------------------------------------|\n * |\n * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | 0 | |\n * 3d | RETURNDATASIZE | 0 0 | |\n * 3d | RETURNDATASIZE | 0 0 0 | |\n * 3d | RETURNDATASIZE | 0 0 0 0 | |\n * |\n * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds 0 0 0 0 | |\n * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | |\n * 3d | RETURNDATASIZE | 0 0 cds 0 0 0 0 | |\n * 37 | CALLDATACOPY | 0 0 0 0 | [0..cds): calldata |\n * |\n * ::: delegate call to the implementation contract :::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds 0 0 0 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | 0 cds 0 0 0 0 | [0..cds): calldata |\n * 73 addr | PUSH20 addr | addr 0 cds 0 0 0 0 | [0..cds): calldata |\n * 5a | GAS | gas addr 0 cds 0 0 0 0 | [0..cds): calldata |\n * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata |\n * |\n * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata |\n * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata |\n * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata |\n * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata |\n * |\n * 60 0x2a | PUSH1 0x2a | 0x2a success 0 rds | [0..rds): returndata |\n * 57 | JUMPI | 0 rds | [0..rds): returndata |\n * |\n * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * fd | REVERT | | [0..rds): returndata |\n * |\n * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 5b | JUMPDEST | 0 rds | [0..rds): returndata |\n * f3 | RETURN | | [0..rds): returndata |\n * --------------------------------------------------------------------------+\n */\n\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\n mstore(0x14, implementation)\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\n instance := create(0, 0x0c, 0x35)\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x21, 0)\n }\n }\n\n /// @dev Deploys a deterministic clone of `implementation` with `salt`.\n function cloneDeterministic(address implementation, bytes32 salt)\n internal\n returns (address instance)\n {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\n mstore(0x14, implementation)\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\n instance := create2(0, 0x0c, 0x35, salt)\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x21, 0)\n }\n }\n\n /// @dev Returns the initialization code hash of the clone of `implementation`.\n /// Used for mining vanity addresses with create2crunch.\n function initCodeHash(address implementation) internal pure returns (bytes32 hash) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x21, 0x5af43d3d93803e602a57fd5bf3)\n mstore(0x14, implementation)\n mstore(0x00, 0x602c3d8160093d39f33d3d3d3d363d3d37363d73)\n hash := keccak256(0x0c, 0x35)\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x21, 0)\n }\n }\n\n /// @dev Returns the address of the deterministic clone of `implementation`,\n /// with `salt` by `deployer`.\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\n function predictDeterministicAddress(address implementation, bytes32 salt, address deployer)\n internal\n pure\n returns (address predicted)\n {\n bytes32 hash = initCodeHash(implementation);\n predicted = predictDeterministicAddress(hash, salt, deployer);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* MINIMAL PROXY OPERATIONS (PUSH0 VARIANT) */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Deploys a PUSH0 clone of `implementation`.\n function clone_PUSH0(address implementation) internal returns (address instance) {\n /// @solidity memory-safe-assembly\n assembly {\n /**\n * --------------------------------------------------------------------------+\n * CREATION (9 bytes) |\n * --------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * --------------------------------------------------------------------------|\n * 60 runSize | PUSH1 runSize | r | |\n * 5f | PUSH0 | 0 r | |\n * 81 | DUP2 | r 0 r | |\n * 60 offset | PUSH1 offset | o r 0 r | |\n * 5f | PUSH0 | 0 o r 0 r | |\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\n * f3 | RETURN | | [0..runSize): runtime code |\n * --------------------------------------------------------------------------|\n * RUNTIME (45 bytes) |\n * --------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * --------------------------------------------------------------------------|\n * |\n * ::: keep some values in stack ::::::::::::::::::::::::::::::::::::::::::: |\n * 5f | PUSH0 | 0 | |\n * 5f | PUSH0 | 0 0 | |\n * |\n * ::: copy calldata to memory ::::::::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds 0 0 | |\n * 5f | PUSH0 | 0 cds 0 0 | |\n * 5f | PUSH0 | 0 0 cds 0 0 | |\n * 37 | CALLDATACOPY | 0 0 | [0..cds): calldata |\n * |\n * ::: delegate call to the implementation contract :::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds 0 0 | [0..cds): calldata |\n * 5f | PUSH0 | 0 cds 0 0 | [0..cds): calldata |\n * 73 addr | PUSH20 addr | addr 0 cds 0 0 | [0..cds): calldata |\n * 5a | GAS | gas addr 0 cds 0 0 | [0..cds): calldata |\n * f4 | DELEGATECALL | success | [0..cds): calldata |\n * |\n * ::: copy return data to memory :::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | rds success | [0..cds): calldata |\n * 5f | PUSH0 | 0 rds success | [0..cds): calldata |\n * 5f | PUSH0 | 0 0 rds success | [0..cds): calldata |\n * 3e | RETURNDATACOPY | success | [0..rds): returndata |\n * |\n * 60 0x29 | PUSH1 0x29 | 0x29 success | [0..rds): returndata |\n * 57 | JUMPI | | [0..rds): returndata |\n * |\n * ::: revert :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | rds | [0..rds): returndata |\n * 5f | PUSH0 | 0 rds | [0..rds): returndata |\n * fd | REVERT | | [0..rds): returndata |\n * |\n * ::: return :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 5b | JUMPDEST | | [0..rds): returndata |\n * 3d | RETURNDATASIZE | rds | [0..rds): returndata |\n * 5f | PUSH0 | 0 rds | [0..rds): returndata |\n * f3 | RETURN | | [0..rds): returndata |\n * --------------------------------------------------------------------------+\n */\n\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\n mstore(0x14, implementation) // 20\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\n instance := create(0, 0x0e, 0x36)\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x24, 0)\n }\n }\n\n /// @dev Deploys a deterministic PUSH0 clone of `implementation` with `salt`.\n function cloneDeterministic_PUSH0(address implementation, bytes32 salt)\n internal\n returns (address instance)\n {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\n mstore(0x14, implementation) // 20\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\n instance := create2(0, 0x0e, 0x36, salt)\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x24, 0)\n }\n }\n\n /// @dev Returns the initialization code hash of the PUSH0 clone of `implementation`.\n /// Used for mining vanity addresses with create2crunch.\n function initCodeHash_PUSH0(address implementation) internal pure returns (bytes32 hash) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x24, 0x5af43d5f5f3e6029573d5ffd5b3d5ff3) // 16\n mstore(0x14, implementation) // 20\n mstore(0x00, 0x602d5f8160095f39f35f5f365f5f37365f73) // 9 + 9\n hash := keccak256(0x0e, 0x36)\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x24, 0)\n }\n }\n\n /// @dev Returns the address of the deterministic PUSH0 clone of `implementation`,\n /// with `salt` by `deployer`.\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\n function predictDeterministicAddress_PUSH0(\n address implementation,\n bytes32 salt,\n address deployer\n ) internal pure returns (address predicted) {\n bytes32 hash = initCodeHash_PUSH0(implementation);\n predicted = predictDeterministicAddress(hash, salt, deployer);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* CLONES WITH IMMUTABLE ARGS OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Deploys a minimal proxy with `implementation`,\n /// using immutable arguments encoded in `data`.\n ///\n /// Note: This implementation of CWIA differs from the original implementation.\n /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.\n function clone(address implementation, bytes memory data) internal returns (address instance) {\n assembly {\n // Compute the boundaries of the data and cache the memory slots around it.\n let mBefore3 := mload(sub(data, 0x60))\n let mBefore2 := mload(sub(data, 0x40))\n let mBefore1 := mload(sub(data, 0x20))\n let dataLength := mload(data)\n let dataEnd := add(add(data, 0x20), dataLength)\n let mAfter1 := mload(dataEnd)\n\n // +2 bytes for telling how much data there is appended to the call.\n let extraLength := add(dataLength, 2)\n // The `creationSize` is `extraLength + 108`\n // The `runSize` is `creationSize - 10`.\n\n /**\n * ---------------------------------------------------------------------------------------------------+\n * CREATION (10 bytes) |\n * ---------------------------------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * ---------------------------------------------------------------------------------------------------|\n * 61 runSize | PUSH2 runSize | r | |\n * 3d | RETURNDATASIZE | 0 r | |\n * 81 | DUP2 | r 0 r | |\n * 60 offset | PUSH1 offset | o r 0 r | |\n * 3d | RETURNDATASIZE | 0 o r 0 r | |\n * 39 | CODECOPY | 0 r | [0..runSize): runtime code |\n * f3 | RETURN | | [0..runSize): runtime code |\n * ---------------------------------------------------------------------------------------------------|\n * RUNTIME (98 bytes + extraLength) |\n * ---------------------------------------------------------------------------------------------------|\n * Opcode | Mnemonic | Stack | Memory |\n * ---------------------------------------------------------------------------------------------------|\n * |\n * ::: if no calldata, emit event & return w/o `DELEGATECALL` ::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds | |\n * 60 0x2c | PUSH1 0x2c | 0x2c cds | |\n * 57 | JUMPI | | |\n * 34 | CALLVALUE | cv | |\n * 3d | RETURNDATASIZE | 0 cv | |\n * 52 | MSTORE | | [0..0x20): callvalue |\n * 7f sig | PUSH32 0x9e.. | sig | [0..0x20): callvalue |\n * 59 | MSIZE | 0x20 sig | [0..0x20): callvalue |\n * 3d | RETURNDATASIZE | 0 0x20 sig | [0..0x20): callvalue |\n * a1 | LOG1 | | [0..0x20): callvalue |\n * 00 | STOP | | [0..0x20): callvalue |\n * 5b | JUMPDEST | | |\n * |\n * ::: copy calldata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds | |\n * 3d | RETURNDATASIZE | 0 cds | |\n * 3d | RETURNDATASIZE | 0 0 cds | |\n * 37 | CALLDATACOPY | | [0..cds): calldata |\n * |\n * ::: keep some values in stack :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | 0 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | 0 0 0 | [0..cds): calldata |\n * 3d | RETURNDATASIZE | 0 0 0 0 | [0..cds): calldata |\n * 61 extra | PUSH2 extra | e 0 0 0 0 | [0..cds): calldata |\n * |\n * ::: copy extra data to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 80 | DUP1 | e e 0 0 0 0 | [0..cds): calldata |\n * 60 0x62 | PUSH1 0x62 | 0x62 e e 0 0 0 0 | [0..cds): calldata |\n * 36 | CALLDATASIZE | cds 0x62 e e 0 0 0 0 | [0..cds): calldata |\n * 39 | CODECOPY | e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * |\n * ::: delegate call to the implementation contract ::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 36 | CALLDATASIZE | cds e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 01 | ADD | cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 3d | RETURNDATASIZE | 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 73 addr | PUSH20 addr | addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 5a | GAS | gas addr 0 cds+e 0 0 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * f4 | DELEGATECALL | success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * |\n * ::: copy return data to memory ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 3d | RETURNDATASIZE | rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 3d | RETURNDATASIZE | rds rds success 0 0 | [0..cds): calldata, [cds..cds+e): extraData |\n * 93 | SWAP4 | 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData |\n * 80 | DUP1 | 0 0 rds success 0 rds | [0..cds): calldata, [cds..cds+e): extraData |\n * 3e | RETURNDATACOPY | success 0 rds | [0..rds): returndata |\n * |\n * 60 0x60 | PUSH1 0x60 | 0x60 success 0 rds | [0..rds): returndata |\n * 57 | JUMPI | 0 rds | [0..rds): returndata |\n * |\n * ::: revert ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * fd | REVERT | | [0..rds): returndata |\n * |\n * ::: return ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |\n * 5b | JUMPDEST | 0 rds | [0..rds): returndata |\n * f3 | RETURN | | [0..rds): returndata |\n * ---------------------------------------------------------------------------------------------------+\n */\n // Write the bytecode before the data.\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\n // Write the address of the implementation.\n mstore(sub(data, 0x0d), implementation)\n // Write the rest of the bytecode.\n mstore(\n sub(data, 0x21),\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\n )\n // `keccak256(\"ReceiveETH(uint256)\")`\n mstore(\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\n )\n mstore(\n // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.\n // The actual EVM limit may be smaller and may change over time.\n sub(data, add(0x59, lt(extraLength, 0xff9e))),\n or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)\n )\n mstore(dataEnd, shl(0xf0, extraLength))\n\n // Create the instance.\n instance := create(0, sub(data, 0x4c), add(extraLength, 0x6c))\n\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n\n // Restore the overwritten memory surrounding `data`.\n mstore(dataEnd, mAfter1)\n mstore(data, dataLength)\n mstore(sub(data, 0x20), mBefore1)\n mstore(sub(data, 0x40), mBefore2)\n mstore(sub(data, 0x60), mBefore3)\n }\n }\n\n /// @dev Deploys a deterministic clone of `implementation`,\n /// using immutable arguments encoded in `data`, with `salt`.\n ///\n /// Note: This implementation of CWIA differs from the original implementation.\n /// If the calldata is empty, it will emit a `ReceiveETH(uint256)` event and skip the `DELEGATECALL`.\n function cloneDeterministic(address implementation, bytes memory data, bytes32 salt)\n internal\n returns (address instance)\n {\n assembly {\n // Compute the boundaries of the data and cache the memory slots around it.\n let mBefore3 := mload(sub(data, 0x60))\n let mBefore2 := mload(sub(data, 0x40))\n let mBefore1 := mload(sub(data, 0x20))\n let dataLength := mload(data)\n let dataEnd := add(add(data, 0x20), dataLength)\n let mAfter1 := mload(dataEnd)\n\n // +2 bytes for telling how much data there is appended to the call.\n let extraLength := add(dataLength, 2)\n\n // Write the bytecode before the data.\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\n // Write the address of the implementation.\n mstore(sub(data, 0x0d), implementation)\n // Write the rest of the bytecode.\n mstore(\n sub(data, 0x21),\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\n )\n // `keccak256(\"ReceiveETH(uint256)\")`\n mstore(\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\n )\n mstore(\n // Do a out-of-gas revert if `extraLength` is too big. 0xffff - 0x62 + 0x01 = 0xff9e.\n // The actual EVM limit may be smaller and may change over time.\n sub(data, add(0x59, lt(extraLength, 0xff9e))),\n or(shl(0x78, add(extraLength, 0x62)), 0xfd6100003d81600a3d39f336602c57343d527f)\n )\n mstore(dataEnd, shl(0xf0, extraLength))\n\n // Create the instance.\n instance := create2(0, sub(data, 0x4c), add(extraLength, 0x6c), salt)\n\n // If `instance` is zero, revert.\n if iszero(instance) {\n // Store the function selector of `DeploymentFailed()`.\n mstore(0x00, 0x30116425)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n\n // Restore the overwritten memory surrounding `data`.\n mstore(dataEnd, mAfter1)\n mstore(data, dataLength)\n mstore(sub(data, 0x20), mBefore1)\n mstore(sub(data, 0x40), mBefore2)\n mstore(sub(data, 0x60), mBefore3)\n }\n }\n\n /// @dev Returns the initialization code hash of the clone of `implementation`\n /// using immutable arguments encoded in `data`.\n /// Used for mining vanity addresses with create2crunch.\n function initCodeHash(address implementation, bytes memory data)\n internal\n pure\n returns (bytes32 hash)\n {\n assembly {\n // Compute the boundaries of the data and cache the memory slots around it.\n let mBefore3 := mload(sub(data, 0x60))\n let mBefore2 := mload(sub(data, 0x40))\n let mBefore1 := mload(sub(data, 0x20))\n let dataLength := mload(data)\n let dataEnd := add(add(data, 0x20), dataLength)\n let mAfter1 := mload(dataEnd)\n\n // Do a out-of-gas revert if `dataLength` is too big. 0xffff - 0x02 - 0x62 = 0xff9b.\n // The actual EVM limit may be smaller and may change over time.\n returndatacopy(returndatasize(), returndatasize(), gt(dataLength, 0xff9b))\n\n // +2 bytes for telling how much data there is appended to the call.\n let extraLength := add(dataLength, 2)\n\n // Write the bytecode before the data.\n mstore(data, 0x5af43d3d93803e606057fd5bf3)\n // Write the address of the implementation.\n mstore(sub(data, 0x0d), implementation)\n // Write the rest of the bytecode.\n mstore(\n sub(data, 0x21),\n or(shl(0x48, extraLength), 0x593da1005b363d3d373d3d3d3d610000806062363936013d73)\n )\n // `keccak256(\"ReceiveETH(uint256)\")`\n mstore(\n sub(data, 0x3a), 0x9e4ac34f21c619cefc926c8bd93b54bf5a39c7ab2127a895af1cc0691d7e3dff\n )\n mstore(\n sub(data, 0x5a),\n or(shl(0x78, add(extraLength, 0x62)), 0x6100003d81600a3d39f336602c57343d527f)\n )\n mstore(dataEnd, shl(0xf0, extraLength))\n\n // Compute and store the bytecode hash.\n hash := keccak256(sub(data, 0x4c), add(extraLength, 0x6c))\n\n // Restore the overwritten memory surrounding `data`.\n mstore(dataEnd, mAfter1)\n mstore(data, dataLength)\n mstore(sub(data, 0x20), mBefore1)\n mstore(sub(data, 0x40), mBefore2)\n mstore(sub(data, 0x60), mBefore3)\n }\n }\n\n /// @dev Returns the address of the deterministic clone of\n /// `implementation` using immutable arguments encoded in `data`, with `salt`, by `deployer`.\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\n function predictDeterministicAddress(\n address implementation,\n bytes memory data,\n bytes32 salt,\n address deployer\n ) internal pure returns (address predicted) {\n bytes32 hash = initCodeHash(implementation, data);\n predicted = predictDeterministicAddress(hash, salt, deployer);\n }\n\n /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/\n /* OTHER OPERATIONS */\n /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/\n\n /// @dev Returns the address when a contract with initialization code hash,\n /// `hash`, is deployed with `salt`, by `deployer`.\n /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.\n function predictDeterministicAddress(bytes32 hash, bytes32 salt, address deployer)\n internal\n pure\n returns (address predicted)\n {\n /// @solidity memory-safe-assembly\n assembly {\n // Compute and store the bytecode hash.\n mstore8(0x00, 0xff) // Write the prefix.\n mstore(0x35, hash)\n mstore(0x01, shl(96, deployer))\n mstore(0x15, salt)\n predicted := keccak256(0x00, 0x55)\n // Restore the part of the free memory pointer that has been overwritten.\n mstore(0x35, 0)\n }\n }\n\n /// @dev Reverts if `salt` does not start with either the zero address or the caller.\n function checkStartsWithCaller(bytes32 salt) internal view {\n /// @solidity memory-safe-assembly\n assembly {\n // If the salt does not start with the zero address or the caller.\n if iszero(or(iszero(shr(96, salt)), eq(caller(), shr(96, salt)))) {\n // Store the function selector of `SaltDoesNotStartWithCaller()`.\n mstore(0x00, 0x2f634836)\n // Revert with (offset, size).\n revert(0x1c, 0x04)\n }\n }\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 1000000 + }, + "evmVersion": "paris", + "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/deployments/muster_testnet/Webauthn.json b/deployments/muster_testnet/Webauthn.json deleted file mode 100644 index 68ed32c..0000000 --- a/deployments/muster_testnet/Webauthn.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "address": "0x04641D72fbE21Db00c1d2f04d19E8206fB8D1eD3", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x2256b97628494826c9037a013a9211ca234efcc9f69bdec8dd97374ae3e564c8", - "receipt": { - "to": "0x6A78a27E52fa669C0a5246574Ece2e9a64c483B1", - "from": "0xbcE1ECDf21a8B27ddDd23d0F07827925299b9C39", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "1756261", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x744f3b3f5d954f2c411bfedfd4feb612f3af9cf09186bb8c68c21b40b9f9151a", - "transactionHash": "0x2256b97628494826c9037a013a9211ca234efcc9f69bdec8dd97374ae3e564c8", - "logs": [], - "blockNumber": 86, - "cumulativeGasUsed": "1756261", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/muster_testnet/WrapperFCLWebAuthn.json b/deployments/muster_testnet/WrapperFCLWebAuthn.json deleted file mode 100644 index cce69be..0000000 --- a/deployments/muster_testnet/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "address": "0xB15bb4dE71bF6fbB91913872dB9F18E6C8897E9F", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x5ea3ad18018735438ea8df0a8b9c2900b809472b10c79b97214ff3acb5de9b52", - "receipt": { - "to": "0x6A78a27E52fa669C0a5246574Ece2e9a64c483B1", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "1685561", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7fdde1064fedfd02428d10a359303d52df59efefbfacdfab2d107f08f09ed587", - "transactionHash": "0x5ea3ad18018735438ea8df0a8b9c2900b809472b10c79b97214ff3acb5de9b52", - "logs": [], - "blockNumber": 9063, - "cumulativeGasUsed": "1685561", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/muster_testnet_production/Webauthn.json b/deployments/muster_testnet_production/Webauthn.json deleted file mode 100644 index f4c5d1b..0000000 --- a/deployments/muster_testnet_production/Webauthn.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "address": "0xAB57C7CC84fCb57Ac919b672714FABcc1b78CF39", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xae686c64c8d187113f7799dd5a39975fcb1ec89224e1fbd94056ee572775cdec", - "receipt": { - "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", - "from": "0xbcE1ECDf21a8B27ddDd23d0F07827925299b9C39", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "1756692", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xd0c3c8de62ca4d089374ba91858d8327bcd6201da60eed609ed38e40577b96e5", - "transactionHash": "0xae686c64c8d187113f7799dd5a39975fcb1ec89224e1fbd94056ee572775cdec", - "logs": [], - "blockNumber": 92, - "cumulativeGasUsed": "1756692", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/muster_testnet_production/WrapperFCLWebAuthn.json b/deployments/muster_testnet_production/WrapperFCLWebAuthn.json deleted file mode 100644 index fad573b..0000000 --- a/deployments/muster_testnet_production/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "address": "0x21D84679F9dd3f0e4914a806113CF329368d5253", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xe237b3fbc7e18f8a2860f3a0e80c3df752a9aac4900db62a3d509a4152bc69fa", - "receipt": { - "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "1701955", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xebfb4904050b1b69b76b1dadb968532e3caa0b850795bde24abc543a23f2a5c7", - "transactionHash": "0xe237b3fbc7e18f8a2860f3a0e80c3df752a9aac4900db62a3d509a4152bc69fa", - "logs": [], - "blockNumber": 9099, - "cumulativeGasUsed": "1701955", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/muster_testnet_staging/Webauthn.json b/deployments/muster_testnet_staging/Webauthn.json deleted file mode 100644 index f31396e..0000000 --- a/deployments/muster_testnet_staging/Webauthn.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "address": "0xf6e6a4f353f7b8117f9313dFBA05568b8E836140", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xdd4139c0da3372502c621744403d602f58bcf56ba98daf01c636bde82dd1a5ed", - "receipt": { - "to": "0x1C702034b2533639f25601024565b087f8cD9391", - "from": "0xbcE1ECDf21a8B27ddDd23d0F07827925299b9C39", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "1756369", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x3f6a3009ab874b721aed0e93d7251bc38c3cb2fda776bc2b7758416e71ce02ab", - "transactionHash": "0xdd4139c0da3372502c621744403d602f58bcf56ba98daf01c636bde82dd1a5ed", - "logs": [], - "blockNumber": 96, - "cumulativeGasUsed": "1756369", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/muster_testnet_staging/WrapperFCLWebAuthn.json b/deployments/muster_testnet_staging/WrapperFCLWebAuthn.json deleted file mode 100644 index 584c753..0000000 --- a/deployments/muster_testnet_staging/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "address": "0xa8a027c9433A56b35e1efcC8F396C7cf8243f3c3", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xdb0323f8efbb75a19ca0be62e4bec3325dc9011765454b51fcc3ee9e73fc6b22", - "receipt": { - "to": "0x1C702034b2533639f25601024565b087f8cD9391", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "1704747", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x938e40c9003a419b9969553c85c280ca24e7ff5cf53e11fdf9b8c75148708ab1", - "transactionHash": "0xdb0323f8efbb75a19ca0be62e4bec3325dc9011765454b51fcc3ee9e73fc6b22", - "logs": [], - "blockNumber": 9122, - "cumulativeGasUsed": "1704747", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/polygon_production/Webauthn.json b/deployments/polygon_production/Webauthn.json deleted file mode 100644 index 6cb1c0f..0000000 --- a/deployments/polygon_production/Webauthn.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "address": "0xAB57C7CC84fCb57Ac919b672714FABcc1b78CF39", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/polygon_production/WrapperFCLWebAuthn.json b/deployments/polygon_production/WrapperFCLWebAuthn.json deleted file mode 100644 index 22b79f3..0000000 --- a/deployments/polygon_production/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "address": "0x21D84679F9dd3f0e4914a806113CF329368d5253", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xd7be4054ab3131707fcabd39ad92fce942a48ab223158dfaa80597984ea83d5d", - "receipt": { - "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 63, - "gasUsed": "1488525", - "logsBloom": "0x00000000000001000000000000000000000000000000000000000000000000000000000000090000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100010000000000000000000000000000000000080000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000008000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", - "blockHash": "0x476aa2a71e24a739d2bcd53382241a58bcb1280e044a7a5ad4fe61955d9e1845", - "transactionHash": "0xd7be4054ab3131707fcabd39ad92fce942a48ab223158dfaa80597984ea83d5d", - "logs": [ - { - "transactionIndex": 63, - "blockNumber": 51306951, - "transactionHash": "0xd7be4054ab3131707fcabd39ad92fce942a48ab223158dfaa80597984ea83d5d", - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x00000000000000000000000065245f19c92ac5adce53244406ad126398ef203a", - "0x00000000000000000000000060e274b09f701107a4b3226fcc1376ebda3cdd92" - ], - "data": "0x000000000000000000000000000000000000000000000000009f2494e16089630000000000000000000000000000000000000000000000005589601295c5683100000000000000000000000000000000000000000000044fa3c5c8deed06566000000000000000000000000000000000000000000000000054ea3b7db464dece00000000000000000000000000000000000000000000044fa464ed73ce66dfc3", - "logIndex": 230, - "blockHash": "0x476aa2a71e24a739d2bcd53382241a58bcb1280e044a7a5ad4fe61955d9e1845" - } - ], - "blockNumber": 51306951, - "cumulativeGasUsed": "7687463", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/polygon_staging/Webauthn.json b/deployments/polygon_staging/Webauthn.json deleted file mode 100644 index 5f0c849..0000000 --- a/deployments/polygon_staging/Webauthn.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "address": "0xf6e6a4f353f7b8117f9313dFBA05568b8E836140", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x58b1aa941862db97171afcccb95f9204b038e7cecbed67dc3704fdea2ae139e4", - "receipt": { - "to": "0x1C702034b2533639f25601024565b087f8cD9391", - "from": "0xbcE1ECDf21a8B27ddDd23d0F07827925299b9C39", - "contractAddress": null, - "transactionIndex": 4, - "gasUsed": "1594097", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000108000000100000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000040000100000000000000000000000000000001000000000000000004000000000000000000001000000000000000100000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", - "blockHash": "0x7a6f27b83b59e74e9c27bd47a616e2a918feb19a2d091082cf08ff94713dc125", - "transactionHash": "0x58b1aa941862db97171afcccb95f9204b038e7cecbed67dc3704fdea2ae139e4", - "logs": [ - { - "transactionIndex": 4, - "blockNumber": 48865602, - "transactionHash": "0x58b1aa941862db97171afcccb95f9204b038e7cecbed67dc3704fdea2ae139e4", - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x000000000000000000000000bce1ecdf21a8b27dddd23d0f07827925299b9c39", - "0x00000000000000000000000026c80cc193b27d73d2c40943acec77f4da2c5bd8" - ], - "data": "0x000000000000000000000000000000000000000000000000015ddd2be44c323a000000000000000000000000000000000000000000000000373194fbfac075310000000000000000000000000000000000000000000037f368ca56705951d0d300000000000000000000000000000000000000000000000035d3b7d0167442f70000000000000000000000000000000000000000000037f36a28339c3d9e030d", - "logIndex": 13, - "blockHash": "0x7a6f27b83b59e74e9c27bd47a616e2a918feb19a2d091082cf08ff94713dc125" - } - ], - "blockNumber": 48865602, - "cumulativeGasUsed": "2037444", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/polygon_staging/WrapperFCLWebAuthn.json b/deployments/polygon_staging/WrapperFCLWebAuthn.json deleted file mode 100644 index 0183ac3..0000000 --- a/deployments/polygon_staging/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "address": "0xa8a027c9433A56b35e1efcC8F396C7cf8243f3c3", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x9af3a220850673e6c9d85d52d67323249205bbd42e2e734a767fdc3e7c3b7276", - "receipt": { - "to": "0x1C702034b2533639f25601024565b087f8cD9391", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 96, - "gasUsed": "1488525", - "logsBloom": "0x00000000000001000000000000000000000000000000000000000000000000000000000000010000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000800000000008000001000000008000000000000000000000100000000000000000020000000000000000000000000000000000000000000000000000100000", - "blockHash": "0x2fc4d1750660747cee47a429c4d9196b2d0d00cb54d024b14ea96ecf8af5735a", - "transactionHash": "0x9af3a220850673e6c9d85d52d67323249205bbd42e2e734a767fdc3e7c3b7276", - "logs": [ - { - "transactionIndex": 96, - "blockNumber": 51311676, - "transactionHash": "0x9af3a220850673e6c9d85d52d67323249205bbd42e2e734a767fdc3e7c3b7276", - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x00000000000000000000000065245f19c92ac5adce53244406ad126398ef203a", - "0x00000000000000000000000067b94473d81d0cd00849d563c94d0432ac988b49" - ], - "data": "0x00000000000000000000000000000000000000000000000000a5b8b4501ccede000000000000000000000000000000000000000000000000528072dc2534f831000000000000000000000000000000000000000000001b40e914f58878b5b35300000000000000000000000000000000000000000000000051daba27d5182953000000000000000000000000000000000000000000001b40e9baae3cc8d28231", - "logIndex": 442, - "blockHash": "0x2fc4d1750660747cee47a429c4d9196b2d0d00cb54d024b14ea96ecf8af5735a" - } - ], - "blockNumber": 51311676, - "cumulativeGasUsed": "10338100", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/deployments/redstone_holesky_production/Webauthn.json b/deployments/redstone_holesky_production/Webauthn.json deleted file mode 100644 index feebf51..0000000 --- a/deployments/redstone_holesky_production/Webauthn.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "address": "0xAB57C7CC84fCb57Ac919b672714FABcc1b78CF39", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0x9164fc86ec6a9f5d988005b9faabf3eb3ee6fbd8ace2005ccacd0dab46458feb", - "receipt": { - "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", - "from": "0x39946fd82C9C86c9A61BceeD86fbdd284590bDd9", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "1594097", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xe810fddde5fe7753e26f66497c914381def1ba753596152e22538616ef45f6c5", - "transactionHash": "0x9164fc86ec6a9f5d988005b9faabf3eb3ee6fbd8ace2005ccacd0dab46458feb", - "logs": [], - "blockNumber": 936726, - "cumulativeGasUsed": "1640962", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "5775f6fb0e5df41b1e0121d96a0fbccf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"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/Webauthn.sol\":\"Webauthn\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"contracts/Base64URL.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// from OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n *\\n * _Available since v4.5._\\n */\\nlibrary Base64URL {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode32(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n //string memory result = new string(4 * ((data.length + 2) / 3));\\n string memory result = new string(4 * ((data.length + 2) / 3) - 1);\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 32)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 bytes (18 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F which is the number of\\n // the previous character in the ASCII table prior to the Base64 Table\\n // The result is then added to the table to get the character to write,\\n // and finally write it in the result pointer but with a left shift\\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n /*\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n*/\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0xcf1ca3e3e85d1b22dec76240ef3b23f9f6416d76eb7483b80a7d0a8a8e9aa664\",\"license\":\"MIT\"},\"contracts/FCL/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _ \\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__ \\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_| \\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project \\n///* License: This software is licensed under MIT License \\t \\n///* This Code may be reused including license and copyright notice. \\t \\n///* See LICENSE file at the root folder of the project.\\t\\t\\t\\t \\n///* FILE: FCL_elliptic.sol\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* \\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t \\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///* \\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n\\n\\n//import \\\"hardhat/console.sol\\\";\\n\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n \\n //curve prime field modulus\\n uint constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint constant a =\\n 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient \\n uint constant b =\\n 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates \\n uint constant gx =\\n 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint constant gy =\\n 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint constant n =\\n 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551; \\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F; \\n \\n uint constant minus_1= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n \\n /**\\n /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem*/\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly {\\n \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n \\n }\\n /**\\n /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled*/\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n uint[6] memory pointer;\\n assembly { \\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) {\\n revert(0, 0)\\n }\\n result:=mload(pointer)\\n }\\n }\\n \\n /**\\n /* @dev Convert from affine rep to XYZZ rep*/\\n function ecAff_SetZZ(\\n uint x0,\\n uint y0\\n ) internal pure returns (uint[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n \\n /**\\n /* @dev Convert from XYZZ rep to affine rep*/ \\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff( uint x,\\n uint y,\\n uint zz,\\n uint zzz) internal view returns (uint x1, uint y1)\\n {\\n uint zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1=mulmod(y,zzzInv,p);//Y/zzz\\n uint b=mulmod(zz, zzzInv,p); //1/z\\n zzzInv= mulmod(b,b,p); //1/zz\\n x1=mulmod(x,zzzInv,p);//X/zz\\n }\\n \\n \\n \\n /**\\n /* @dev Sutherland2008 doubling*/\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n \\n function ecZZ_Dbl(\\n \\tuint x,\\n uint y,\\n uint zz,\\n uint zzz\\n ) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n assembly{\\n P0:=mulmod(2, y, p) //U = 2*Y1\\n P2:=mulmod(P0,P0,p) // V=U^2\\n P3:=mulmod(x, P2,p)// S = X1*V\\n P1:=mulmod(P0, P2,p) // W=UV\\n P2:=mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz:=mulmod(3, mulmod(addmod(x,sub(p,zz),p), addmod(x,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0:=addmod(mulmod(zz,zz,p), mulmod(minus_2, P3,p),p) //X3=M^2-2S\\n x:=mulmod(zz,addmod(P3, sub(p,P0),p),p)//M(S-X3)\\n P3:=mulmod(P1,zzz,p)//zzz3=W*zzz1\\n P1:=addmod(x, sub(p, mulmod(P1, y,p)),p )//Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n \\n //tbd: return -x1 and -Y1 in double to avoid two substractions\\n function ecZZ_AddN(\\n \\tuint x1,\\n uint y1,\\n uint zz1,\\n uint zzz1,\\n uint x2,\\n uint y2) internal pure returns (uint P0, uint P1,uint P2,uint P3)\\n {\\n unchecked{\\n if(y1==0){\\n return (x2,y2,1,1);\\n }\\n \\n assembly{\\n y1:=sub(p, y1)\\n y2:=addmod(mulmod(y2, zzz1,p),y1,p) \\n x2:=addmod(mulmod(x2, zz1,p),sub(p,x1),p) \\n P0:=mulmod(x2, x2, p)//PP = P^2\\n P1:=mulmod(P0,x2,p)//PPP = P*PP\\n P2:=mulmod(zz1,P0,p) ////ZZ3 = ZZ1*PP\\n P3:= mulmod(zzz1,P1,p) ////ZZZ3 = ZZZ1*PPP\\n zz1:=mulmod(x1, P0, p)//Q = X1*PP\\n P0:=addmod(addmod(mulmod(y2,y2, p), sub(p,P1),p ), mulmod(minus_2, zz1,p) ,p )//R^2-PPP-2*Q\\n P1:=addmod(mulmod(addmod(zz1, sub(p,P0),p), y2, p), mulmod(y1, P1,p),p)//R*(Q-X3)\\n }\\n //end assembly\\n }//end unchecked\\n return (P0, P1, P2, P3);\\n }\\n \\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint x, uint y, uint zz, uint zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n function ecZZ_IsZero (uint x0, uint y0, uint zz0, uint zzz0) internal pure returns (bool)\\n {\\n if ( (y0 == 0) ) {\\n return true;\\n }\\n return false;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n function ecAff_SetZero() internal pure returns (uint x, uint y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n function ecAff_IsZero(uint x, uint y) internal pure returns (bool flag) {\\n return (y==0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint x, uint y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint LHS = mulmod(y, y, p); // y^2\\n uint RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n \\n return LHS == RHS;\\n }\\n }\\n \\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n \\n function ecAff_add(\\n uint x0,\\n uint y0,\\n uint x1,\\n uint y1\\n ) internal view returns (uint, uint) {\\n uint zz0;\\n uint zzz0;\\n \\n\\tif(ecAff_IsZero(x0,y0)) return (x1,y1);\\n\\tif(ecAff_IsZero(x1,y1)) return (x1,y1);\\n\\t\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1,1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n */\\n function ecZZ_mulmuladd_S_asm(\\n uint Q0, uint Q1,// Point G and Q stored in one memory for stack optimization\\n uint scalar_u,\\n uint scalar_v\\n ) internal view returns (uint X) {\\n uint zz;\\n uint zzz;\\n uint Y;\\n uint index=255;\\n uint[6] memory T;\\n uint H0;\\n uint H1; \\n \\n unchecked {\\n \\n if(scalar_u==0 && scalar_v==0) return 0;\\n \\n (H0,H1 )=ecAff_add(gx,gy,Q0, Q1);//will not work if Q=P, obvious forbidden private key\\n \\n /*\\n while( ( ((scalar_u>>index)&1)+2*((scalar_v>>index)&1) ) ==0){\\n index=index-1; \\n }\\n */\\n \\n assembly{\\n \\n \\n for{ let T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n } eq(T4,0) {\\n index := sub(index, 1)\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n }\\n {}\\n zz:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if eq(zz,1) {\\n \\tX:=gx\\n \\tY:=gy\\n \\t}\\n if eq(zz,2) {\\n X:=Q0\\n \\tY:=Q1\\n }\\n if eq(zz,3) {\\n \\t X:=H0\\n \\t Y:= H1\\n }\\n \\n index:=sub(index,1)\\n zz:=1\\n zzz:=1\\n \\n for { } gt( minus_1, index) { index := sub(index, 1) } \\n {\\n // inlined EcZZ_Dbl\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n { \\n //value of dibit\\t\\n T4:=add( shl(1, and(shr(index, scalar_v),1)), and(shr(index, scalar_u),1) )\\n \\n if iszero(T4){\\n Y:=sub(p,Y)//restore the -Y inversion \\n continue\\n }// if T4!=0\\n \\n if eq(T4,1) {\\n \\tT1:=gx\\n \\tT2:=gy\\n \\t\\n \\t}\\n if eq(T4,2) {\\n T1:=Q0\\n \\tT2:=Q1\\n }\\n if eq(T4,3) {\\n \\t T1:=H0\\n \\t T2:= H1\\n \\t }\\n \\t \\t \\n // inlined EcZZ_AddN\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2:=addmod(mulmod(T2, zzz,p),Y,p) //R\\n T2:=addmod(mulmod(T1, zz,p),sub(p,X),p) //P\\n \\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if eq(y2,0){\\n if eq(T2,0){\\n \\n T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n \\n continue \\n }\\n }\\n \\n T4:=mulmod(T2, T2, p)//PP\\n let TT1:=mulmod(T4,T2,p)//PPP, this one could be spared, but adding this register spare gas\\n zz:=mulmod(zz,T4,p) \\n zzz:= mulmod(zzz,TT1,p) //zz3=V*ZZ1\\n let TT2:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,TT1),p ), mulmod(minus_2, TT2,p) ,p )\\n Y:=addmod(mulmod(addmod(TT2, sub(p,T4),p), y2, p), mulmod(Y, TT1,p),p)\\n \\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X:=mulmod(X,mload(T),p)//X/zz\\n } //end assembly\\n }//end unchecked\\n \\n return X;\\n }\\n \\n \\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint scalar_u, uint scalar_v, address dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n \\n unchecked{ \\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n extcodecopy(dataPointer, T, mload(T), 64)\\n \\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\t{\\n let TT1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(TT1,TT1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n let T1:=mulmod(TT1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T5,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n let index2:=sub(index, 64)\\n let T3:=add(T4, add( shl(12, and(shr(index2, scalar_v),1)), shl(8, and(shr(index2, scalar_u),1)) ))\\n let index3:=sub(index2, 64)\\n let T2:=add(T3,add( shl(11, and(shr(index3, scalar_v),1)), shl(7, and(shr(index3, scalar_u),1)) ))\\n index:=sub(index3, 64)\\n let T1:=add(T2,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n \\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n extcodecopy(dataPointer, T,T1, 64)\\n }\\n \\n {\\n \\n /* Access to precomputed table using extcodecopy hack */\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n let T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n \\n //special case ecAdd(P,P)=EcDbl\\n if eq(y2,0){\\n if eq(T2,0){\\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n \\n let TT1:=mulmod(T1, T2,p) // W=UV\\n y2:= addmod(X,zz,p)\\n TT1:=addmod(X,sub(p,zz),p)\\n y2:=mulmod(y2,TT1,p)\\n T2:=addmod(X,zz,p)\\n T1:=addmod(X,sub(p,zz),p)\\n T2:=mulmod(T1,T2,p)\\n let T4:=mulmod(3,T2,p)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n \\n Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n continue\\n }\\n }\\n \\n let T4:=mulmod(T2, T2, p)\\n let T1:=mulmod(T4,T2,p)//\\n zz:=mulmod(zz,T4,p) //zzz3=V*ZZ1\\n zzz:= mulmod(zzz,T1,p) // W=UV/\\n let zz1:=mulmod(X, T4, p)\\n X:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,X),p), y2, p), mulmod(Y, T1,p),p)\\n \\n \\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n \\n \\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint scalar_u, uint scalar_v, uint dataPointer) \\n internal returns(uint X/*, uint Y*/)\\n {\\n uint zz; // third and coordinates of the point\\n \\n uint[6] memory T;\\n zz=256;//start index\\n \\n unchecked{ \\n \\n while(T[0]==0)\\n {\\n zz=zz-1;\\n //tbd case of msb octobit is null\\n T[0]=64*(128*((scalar_v>>zz)&1)+64*((scalar_v>>(zz-64))&1)+\\n 32*((scalar_v>>(zz-128))&1)+16*((scalar_v>>(zz-192))&1)+\\n 8*((scalar_u>>zz)&1)+4*((scalar_u>>(zz-64))&1)+2*((scalar_u>>(zz-128))&1)+((scalar_u>>(zz-192))&1));\\n }\\n assembly{\\n \\n codecopy( T, add(mload(T), dataPointer), 64)\\n X:= mload(T)\\n let Y:= mload(add(T,32))\\n let zzz:=1\\n zz:=1\\n \\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } \\n { \\n \\n let T1:=mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2:=mulmod(T1,T1,p) // V=U^2\\n let T3:=mulmod(X, T2,p)// S = X1*V\\n T1:=mulmod(T1, T2,p) // W=UV\\n let T4:=mulmod(3, mulmod(addmod(X,sub(p,zz),p), addmod(X,zz,p),p) ,p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz:=mulmod(T1,zzz,p)//zzz3=W*zzz1\\n zz:=mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n \\n X:=addmod(mulmod(T4,T4,p), mulmod(minus_2, T3,p),p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2:=mulmod(T4,addmod(X, sub(p, T3),p),p)//-M(S-X3)=M(X3-S)\\n \\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y:= addmod(mulmod(T1, Y ,p), T2,p )//-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n \\n /* compute element to access in precomputed table */\\n \\n T4:= add( shl(13, and(shr(index, scalar_v),1)), shl(9, and(shr(index, scalar_u),1)) )\\n index:=sub(index, 64)\\n T4:=add(T4, add( shl(12, and(shr(index, scalar_v),1)), shl(8, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(11, and(shr(index, scalar_v),1)), shl(7, and(shr(index, scalar_u),1)) ))\\n index:=sub(index, 64)\\n T4:=add(T4,add( shl(10, and(shr(index, scalar_v),1)), shl(6, and(shr(index, scalar_u),1)) ))\\n //index:=add(index,192), restore index, interleaved with loop\\n \\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4){\\n Y:=sub(p, Y)\\n \\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy( T, add(T4, dataPointer), 64)\\n \\n // inlined EcZZ_AddN\\n \\n \\n let y2:=addmod(mulmod(mload(add(T,32)), zzz,p),Y,p) \\n T2:=addmod(mulmod(mload(T), zz,p),sub(p,X),p) \\n T4:=mulmod(T2, T2, p)\\n T1:=mulmod(T4,T2,p)\\n T2:=mulmod(zz,T4,p) // W=UV\\n zzz:= mulmod(zzz,T1,p) //zz3=V*ZZ1\\n let zz1:=mulmod(X, T4, p)\\n T4:=addmod(addmod(mulmod(y2,y2, p), sub(p,T1),p ), mulmod(minus_2, zz1,p) ,p )\\n Y:=addmod(mulmod(addmod(zz1, sub(p,T4),p), y2, p), mulmod(Y, T1,p),p)\\n zz:=T2\\n X:=T4\\n }\\n \\n }//end loop\\n mstore(add(T, 0x60),zz)\\n \\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n \\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(call(not(0), 0x05, 0, T, 0xc0, T, 0x20)) {\\n revert(0, 0)\\n }\\n \\n zz:=mload(T)\\n X:=mulmod(X,zz,p)//X/zz\\n } \\n }//end unchecked\\n }\\n\\n function ecdsa_verify_mem(\\n bytes32 message,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) internal view returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,mload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint[2] calldata Q\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0||rs[1]>=n) {\\n return false;\\n }\\n \\n \\n if (!ecAff_isOnCurve(Q[0], Q[1])) {\\n return false;\\n }\\n \\t\\n uint sInv = FCL_nModInv(n-rs[1]);\\n \\n uint scalar_u=mulmod(uint(message), sInv, n);\\n uint scalar_v= mulmod(rs[0], sInv, n);\\n uint x1;\\n\\t\\n x1=ecZZ_mulmuladd_S_asm(Q[0], Q[1],scalar_u, scalar_v);\\n \\t\\n \\t\\n assembly{\\n\\t x1:=addmod(x1,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t//return true; \\t\\n return x1 == 0;\\n \\n }\\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_verify(\\n bytes32 message,\\n uint[2] calldata rs,\\n address Shamir8\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n //uint sInv =2;\\n \\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_extcode(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), Shamir8);\\n \\n\\tassembly{\\n\\t\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n\\t\\n\\t \\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n \\n \\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n generation of contract bytecode for precomputations is done using sagemath code \\n (see sage directory, WebAuthn_precompute.sage)\\n */\\n \\n function ecdsa_precomputed_hackmem(\\n bytes32 message,\\n uint[2] calldata rs,\\n uint256 endcontract\\n ) internal returns (bool) {\\n if (rs[0] == 0 || rs[0] >= n || rs[1] == 0) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n \\n uint sInv =FCL_nModInv(rs[1]);\\n \\tuint X;\\n \\n //Shamir 8 dimensions\\t\\n X=ecZZ_mulmuladd_S8_hackmem(mulmod(uint(message), sInv, n), mulmod(rs[0], sInv, n), endcontract);\\n \\n\\tassembly{\\n\\t X:=addmod(X,sub(n,calldataload(rs)), n)\\n\\t}\\n return X == 0;\\n \\n }//end ecdsa_precomputed_verify()\\n}//EOF\\n\\n\\n\",\"keccak256\":\"0xff4afff0bd9034e0de7df18b225e540636313280237c828428103030093f318a\",\"license\":\"MIT\"},\"contracts/Webauthn.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\nimport {Base64URL} from \\\"./Base64URL.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL/FCL_elliptic.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror InvalidAuthenticatorData();\\nerror InvalidClientData();\\nerror InvalidSignature();\\n\\nlibrary Webauthn {\\n function checkSignature(\\n bytes memory authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes memory clientData,\\n bytes32 clientChallenge,\\n uint clientChallengeDataOffset,\\n uint[2] memory rs,\\n uint[2] memory Q\\n ) public view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n if (\\n (authenticatorData[32] & authenticatorDataFlagMask) !=\\n authenticatorDataFlagMask\\n ) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n string memory challengeEncoded = Base64URL.encode32(\\n abi.encodePacked(clientChallenge)\\n );\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n copyBytes(\\n clientData,\\n clientChallengeDataOffset,\\n challengeExtracted.length,\\n challengeExtracted,\\n 0\\n );\\n if (\\n keccak256(abi.encodePacked(bytes(challengeEncoded))) !=\\n keccak256(abi.encodePacked(challengeExtracted))\\n ) {\\n revert InvalidClientData();\\n } \\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n copyBytes(\\n authenticatorData,\\n 0,\\n authenticatorData.length,\\n verifyData,\\n 0\\n );\\n copyBytes(\\n abi.encodePacked(sha256(clientData)),\\n 0,\\n 32,\\n verifyData,\\n authenticatorData.length\\n );\\n bytes32 message = sha256(verifyData);\\n return FCL_Elliptic_ZZ.ecdsa_verify_mem(message, rs, Q);\\n }\\n\\n /*\\n The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license\\n */\\n function copyBytes(\\n bytes memory _from,\\n uint _fromOffset,\\n uint _length,\\n bytes memory _to,\\n uint _toOffset\\n ) internal pure returns (bytes memory _copiedBytes) {\\n uint minLength = _length + _toOffset;\\n require(_to.length >= minLength); // Buffer too small. Should be a better way?\\n uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables\\n uint j = 32 + _toOffset;\\n while (i < (32 + _fromOffset + _length)) {\\n assembly {\\n let tmp := mload(add(_from, i))\\n mstore(add(_to, j), tmp)\\n }\\n i += 32;\\n j += 32;\\n }\\n return _to;\\n }\\n}\\n\",\"keccak256\":\"0x231a3e8eca437f9b00d106499b738372cad0095e6263363e338776285f2fed57\",\"license\":\"Apache-2.0\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x60b0215121bf25612a6739fb2f1ec35f31ee82e4a8216c032c8243d904ab3aa9\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x611c2961003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d6100483660046119c0565b610061565b604051901515815260200160405180910390f35b6000867effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916878960208151811061009a5761009a611a95565b0160200151167fff0000000000000000000000000000000000000000000000000000000000000016146100f9576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006101258660405160200161011191815260200190565b60405160208183030381529060405261035b565b90506000815167ffffffffffffffff81111561014357610143611876565b6040519080825280601f01601f19166020018201604052801561016d576020820181803683370190505b50905061017f88878351846000610484565b50806040516020016101919190611ac4565b60405160208183030381529060405280519060200120826040516020016101b89190611ac4565b6040516020818303038152906040528051906020012014610205576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008a5160206102159190611b22565b67ffffffffffffffff81111561022d5761022d611876565b6040519080825280601f01601f191660200182016040528015610257576020820181803683370190505b50905061026a8b60008d51846000610484565b506102eb60028a60405161027e9190611ac4565b602060405180830381855afa15801561029b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102be9190611b35565b6040516020016102d091815260200190565b60405160208183030381529060405260006020848f51610484565b5060006002826040516102fe9190611ac4565b602060405180830381855afa15801561031b573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061033e9190611b35565b905061034b818888610512565b9c9b505050505050505050505050565b6060815160000361037a57505060408051602081019091526000815290565b6000604051806060016040528060408152602001611bb4604091399050600060016003855160026103ab9190611b22565b6103b59190611b4e565b6103c0906004611b89565b6103ca9190611ba0565b67ffffffffffffffff8111156103e2576103e2611876565b6040519080825280601f01601f19166020018201604052801561040c576020820181803683370190505b509050600182016020820185865187015b80821015610478576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061041d565b50929695505050505050565b606060006104928386611b22565b905080845110156104a257600080fd5b60006104af876020611b22565b905060006104be856020611b22565b90505b866104cd896020611b22565b6104d79190611b22565b8210156105055788820151868201526104f1602083611b22565b91506104fe602082611b22565b90506104c1565b5093979650505050505050565b81516000901580610544575082517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b8061055157506020830151155b80610580575060208301517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255111155b1561058d575060006106a7565b8151602083015161059e91906106ae565b6105aa575060006106a7565b60006105e684600160200201516105e1907fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551611ba0565b610827565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828709905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518387600060200201510985516020870151919250600091610656919085856108b0565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255187517fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551038208159450505050505b9392505050565b60008215806106dc57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b806106e5575081155b8061070f57507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b1561071c57506000610821565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b6000610831611858565b60208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa6108a957600080fd5b5192915050565b600080808060ff6108bf611858565b600080891580156108ce575088155b156108e35760009750505050505050506113f6565b61092f7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58e8e6113fe565b809250819350505060018a851c1660018a861c1660011b015b8061096a5760018503945060018b861c1660018b871c1660011b019050610948565b5060018a851c1660018a861c1660011b019650600187036109cc577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29697507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f594505b600287036109db578b97508a94505b600387036109ea578197508094505b60018403935060019650600195505b837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561134f577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff856002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a850999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b84099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b870908985060018e891c1660018e8a1c1660011b01905080610cd557887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03985050505050611344565b60018103610d24577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610d33578f93508e92505b60038103610d42578593508492505b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8e88090893508061113d578361113d577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a60020994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848e0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8486097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d8f0891507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038f0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8183099150507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c8e0893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e0894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8460030991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b86099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c85099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808e7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808b87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03850899505050505050611344565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e099c507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838f097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089b50505050809b50505050505b6001840393506109f9565b86606084015260208352602080840152602060408401527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808401527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a084015260208360c0856005600019fa6113c757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff835189099750505050505050505b949350505050565b600080808086611415578585935093505050611453565b84611427578585935093505050611453565b61143688886001808a8a61145c565b929a509098509250905061144c88888484611721565b9350935050505b94509492505050565b6000806000808860000361147b57508492508391506001905080611714565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061172f846117d6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b60006117e0611858565b60208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6108a957600080fd5b6040518060c001604052806006906020820280368337509192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126118b657600080fd5b813567ffffffffffffffff808211156118d1576118d1611876565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561191757611917611876565b8160405283815286602085880101111561193057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600082601f83011261196157600080fd5b6040516040810181811067ffffffffffffffff8211171561198457611984611876565b806040525080604084018581111561199b57600080fd5b845b818110156119b557803583526020928301920161199d565b509195945050505050565b6000806000806000806000610120888a0312156119dc57600080fd5b873567ffffffffffffffff808211156119f457600080fd5b611a008b838c016118a5565b985060208a013591507fff0000000000000000000000000000000000000000000000000000000000000082168214611a3757600080fd5b90965060408901359080821115611a4d57600080fd5b50611a5a8a828b016118a5565b9550506060880135935060808801359250611a788960a08a01611950565b9150611a878960e08a01611950565b905092959891949750929550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000825160005b81811015611ae55760208186018101518583015201611acb565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082157610821611af3565b600060208284031215611b4757600080fd5b5051919050565b600082611b84577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761082157610821611af3565b8181038181111561082157610821611af356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220eaf1ca98e985a08fe491859d37834dbac7eb9a1ebdab70e43752f69cd829dd8a64736f6c63430008110033", - "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/deployments/redstone_holesky_production/WrapperFCLWebAuthn.json b/deployments/redstone_holesky_production/WrapperFCLWebAuthn.json deleted file mode 100644 index 9791a06..0000000 --- a/deployments/redstone_holesky_production/WrapperFCLWebAuthn.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "address": "0x21D84679F9dd3f0e4914a806113CF329368d5253", - "abi": [ - { - "inputs": [], - "name": "InvalidAuthenticatorData", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidClientData", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "authenticatorData", - "type": "bytes" - }, - { - "internalType": "bytes1", - "name": "authenticatorDataFlagMask", - "type": "bytes1" - }, - { - "internalType": "bytes", - "name": "clientData", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "clientChallenge", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "clientChallengeDataOffset", - "type": "uint256" - }, - { - "internalType": "uint256[2]", - "name": "rs", - "type": "uint256[2]" - }, - { - "internalType": "uint256[2]", - "name": "Q", - "type": "uint256[2]" - } - ], - "name": "checkSignature", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xda0eb75480b32675d18ee905ba164fcb0eeb25bcb4725159c92374cba8a9eb98", - "receipt": { - "to": "0x51498fd8a6218bab7eC4286642DE2E194274Cd59", - "from": "0x65245F19c92ac5Adce53244406Ad126398EF203A", - "contractAddress": null, - "transactionIndex": 1, - "gasUsed": "1488101", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x6a68efb15322e470c5625bd62c0abd696cfc4831eef337dad1b887e162ac966a", - "transactionHash": "0xda0eb75480b32675d18ee905ba164fcb0eeb25bcb4725159c92374cba8a9eb98", - "logs": [], - "blockNumber": 1848286, - "cumulativeGasUsed": "1534966", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "9a239a13792e7e509c47a689d8b7e7c4", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidAuthenticatorData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidClientData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"authenticatorData\",\"type\":\"bytes\"},{\"internalType\":\"bytes1\",\"name\":\"authenticatorDataFlagMask\",\"type\":\"bytes1\"},{\"internalType\":\"bytes\",\"name\":\"clientData\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"clientChallenge\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"clientChallengeDataOffset\",\"type\":\"uint256\"},{\"internalType\":\"uint256[2]\",\"name\":\"rs\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"Q\",\"type\":\"uint256[2]\"}],\"name\":\"checkSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"WrapperFCLWebAuthn\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FCL/WrapperFCLWebAuthn.sol\":\"WrapperFCLWebAuthn\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"FreshCryptoLib/FCL_Webauthn.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: Implementation of the WebAuthn Authentication mechanism\\n///* https://www.w3.org/TR/webauthn-2/#sctn-intro\\n///* Original code extracted from https://github.com/btchip/Webauthn.sol\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport {Base64Url} from \\\"./utils/Base64Url.sol\\\";\\nimport {FCL_Elliptic_ZZ} from \\\"./FCL_elliptic.sol\\\";\\n\\nlibrary FCL_WebAuthn {\\n error InvalidAuthenticatorData();\\n error InvalidClientData();\\n error InvalidSignature();\\n\\n function WebAuthn_format(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata // rs\\n ) internal pure returns (bytes32 result) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n {\\n if ((authenticatorData[32] & authenticatorDataFlagMask) != authenticatorDataFlagMask) {\\n revert InvalidAuthenticatorData();\\n }\\n // Verify that clientData commits to the expected client challenge\\n // Use the Base64Url encoding which omits padding characters to match WebAuthn Specification\\n string memory challengeEncoded = Base64Url.encode(abi.encodePacked(clientChallenge));\\n bytes memory challengeExtracted = new bytes(\\n bytes(challengeEncoded).length\\n );\\n\\n assembly {\\n calldatacopy(\\n add(challengeExtracted, 32),\\n add(clientData.offset, clientChallengeDataOffset),\\n mload(challengeExtracted)\\n )\\n }\\n\\n bytes32 moreData; //=keccak256(abi.encodePacked(challengeExtracted));\\n assembly {\\n moreData := keccak256(add(challengeExtracted, 32), mload(challengeExtracted))\\n }\\n\\n if (keccak256(abi.encodePacked(bytes(challengeEncoded))) != moreData) {\\n revert InvalidClientData();\\n }\\n } //avoid stack full\\n\\n // Verify the signature over sha256(authenticatorData || sha256(clientData))\\n bytes memory verifyData = new bytes(authenticatorData.length + 32);\\n\\n assembly {\\n calldatacopy(add(verifyData, 32), authenticatorData.offset, authenticatorData.length)\\n }\\n\\n bytes32 more = sha256(clientData);\\n assembly {\\n mstore(add(verifyData, add(authenticatorData.length, 32)), more)\\n }\\n\\n return sha256(verifyData);\\n }\\n\\n function checkSignature (\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_verify(message, rs, Q);\\n\\n return result;\\n }\\n\\n function checkSignature_prec(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n address dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_verify(message, rs, dataPointer);\\n\\n return result;\\n }\\n\\n //beware that this implementation will not be compliant with EOF\\n function checkSignature_hackmem(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256 dataPointer\\n ) internal view returns (bool) {\\n // Let the caller check if User Presence (0x01) or User Verification (0x04) are set\\n\\n bytes32 message = FCL_WebAuthn.WebAuthn_format(\\n authenticatorData, authenticatorDataFlagMask, clientData, clientChallenge, clientChallengeDataOffset, rs\\n );\\n\\n bool result = FCL_Elliptic_ZZ.ecdsa_precomputed_hackmem(message, rs, dataPointer);\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x78658514b1f160f17b8408bddc3615b2bfaf83a50c874cdfba26ce90528214b4\",\"license\":\"MIT\"},\"FreshCryptoLib/FCL_elliptic.sol\":{\"content\":\"//********************************************************************************************/\\n// ___ _ ___ _ _ _ _\\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\\n// | _| '_/ -_|_-< ' \\\\ | (__| '_| || | '_ \\\\ _/ _ \\\\ | |__| | '_ \\\\\\n// |_||_| \\\\___/__/_||_| \\\\___|_| \\\\_, | .__/\\\\__\\\\___/ |____|_|_.__/\\n// |__/|_|\\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\\n///* License: This software is licensed under MIT License\\n///* This Code may be reused including license and copyright notice.\\n///* See LICENSE file at the root folder of the project.\\n///* FILE: FCL_elliptic.sol\\n///*\\n///*\\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\\n///* optimization\\n///*\\n//**************************************************************************************/\\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\\n// if ever used for other curve than sec256R1\\n// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nlibrary FCL_Elliptic_ZZ {\\n // Set parameters for curve sec256r1.\\n\\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\\n //curve prime field modulus\\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n //short weierstrass first coefficient\\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\\n //short weierstrass second coefficient\\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\\n //generating point affine coordinates\\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\\n //curve order (number of points)\\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\\n /* -2 mod n constant, used to speed up inversion*/\\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\\n\\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\\n //P+1 div 4\\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\\n //arbitrary constant to express no quadratic residuosity\\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\\n\\n /**\\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\\n */\\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2modn)\\n mstore(add(pointer, 0xa0), n)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n /**\\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\\n */\\n\\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\\n assembly {\\n let pointer := mload(0x40)\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(pointer, 0x20)\\n mstore(add(pointer, 0x20), 0x20)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n mstore(add(pointer, 0x60), u)\\n mstore(add(pointer, 0x80), minus_2)\\n mstore(add(pointer, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\\n result := mload(pointer)\\n }\\n }\\n\\n //Coron projective shuffling, take as input alpha as blinding factor\\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) public pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n \\n uint256 alpha2=mulmod(alpha,alpha,p);\\n \\n x3=mulmod(alpha2, x,p); //alpha^-2.x\\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\\n\\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\\n \\n return (x3, y3, zz3, zzz3);\\n }\\n\\n\\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\\n {\\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\\n u2=addmod(u2, p-u1, p);// P = U2-U1\\n x1=mulmod(u2, u2, p);//PP\\n x2=mulmod(x1, u2, p);//PPP\\n \\n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \\n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\\n\\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \\n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\\n\\n return (x3, y3, zz3, zzz3);\\n }\\n\\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\\n/// @param self The integer of which to find the modular inverse\\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\\n\\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\\n assembly (\\\"memory-safe\\\") {\\n // load the free memory pointer value\\n let pointer := mload(0x40)\\n\\n // Define length of base (Bsize)\\n mstore(pointer, 0x20)\\n // Define the exponent size (Esize)\\n mstore(add(pointer, 0x20), 0x20)\\n // Define the modulus size (Msize)\\n mstore(add(pointer, 0x40), 0x20)\\n // Define variables base (B)\\n mstore(add(pointer, 0x60), self)\\n // Define the exponent (E)\\n mstore(add(pointer, 0x80), pp1div4)\\n // We save the point of the last argument, it will be override by the result\\n // of the precompile call in order to avoid paying for the memory expansion properly\\n let _result := add(pointer, 0xa0)\\n // Define the modulus (M)\\n mstore(_result, p)\\n\\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\\n if iszero(\\n staticcall(\\n not(0), // amount of gas to send\\n MODEXP_PRECOMPILE, // target\\n pointer, // argsOffset\\n 0xc0, // argsSize (6 * 32 bytes)\\n _result, // retOffset (we override M to avoid paying for the memory expansion)\\n 0x20 // retSize (32 bytes)\\n )\\n ) { revert(0, 0) }\\n\\n result := mload(_result)\\n// result :=addmod(result,0,p)\\n }\\n if(mulmod(result,result,p)!=self){\\n result=_NOTSQUARE;\\n }\\n \\n return result;\\n}\\n /**\\n * /* @dev Convert from affine rep to XYZZ rep\\n */\\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\\n unchecked {\\n P[2] = 1; //ZZ\\n P[3] = 1; //ZZZ\\n P[0] = x0;\\n P[1] = y0;\\n }\\n }\\n\\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \\n\\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\\n\\n y=SqrtMod(y2);\\n if(y==_NOTSQUARE){\\n return _NOTONCURVE;\\n }\\n if((y&1)!=(parity&1)){\\n y=p-y;\\n }\\n }\\n\\n /**\\n * /* @dev Convert from XYZZ rep to affine rep\\n */\\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\\n y1 = mulmod(y, zzzInv, p); //Y/zzz\\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\\n zzzInv = mulmod(_b, _b, p); //1/zz\\n x1 = mulmod(x, zzzInv, p); //X/zz\\n }\\n\\n /**\\n * /* @dev Sutherland2008 doubling\\n */\\n /* The \\\"dbl-2008-s-1\\\" doubling formulas */\\n\\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n assembly {\\n P0 := mulmod(2, y, p) //U = 2*Y1\\n P2 := mulmod(P0, P0, p) // V=U^2\\n P3 := mulmod(x, P2, p) // S = X1*V\\n P1 := mulmod(P0, P2, p) // W=UV\\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\\n }\\n }\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\\n */\\n\\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\\n internal\\n pure\\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\\n {\\n unchecked {\\n if (y1 == 0) {\\n return (x2, y2, 1, 1);\\n }\\n\\n assembly {\\n y1 := sub(p, y1)\\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\\n P0 := mulmod(x2, x2, p) //PP = P^2\\n P1 := mulmod(P0, x2, p) //PPP = P*PP\\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\\n }\\n //end assembly\\n } //end unchecked\\n return (P0, P1, P2, P3);\\n }\\n\\n /**\\n * @dev Return the zero curve in XYZZ coordinates.\\n */\\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\\n return (0, 0, 0, 0);\\n }\\n /**\\n * @dev Check if point is the neutral of the curve\\n */\\n\\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\\n return y0 == 0;\\n }\\n /**\\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\\n */\\n\\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\\n return (0, 0);\\n }\\n\\n /**\\n * @dev Check if the curve is the zero curve in affine rep.\\n */\\n // uint256 x, uint256 y)\\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\\n return (y == 0);\\n }\\n\\n /**\\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\\n */\\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\\n if (0 == x || x == p || 0 == y || y == p) {\\n return false;\\n }\\n unchecked {\\n uint256 LHS = mulmod(y, y, p); // y^2\\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\\n\\n return LHS == RHS;\\n }\\n }\\n\\n /**\\n * @dev Add two elliptic curve points in affine coordinates.\\n */\\n\\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\\n uint256 zz0;\\n uint256 zzz0;\\n\\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\\n\\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\\n\\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\\n }\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns only x for ECDSA use \\n * */\\n function ecZZ_mulmuladd_S_asm(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 Y;\\n uint256 index = 255;\\n uint256 H0;\\n uint256 H1;\\n\\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return 0;\\n\\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n X := H0\\n Y := H1\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := H0\\n T2 := H1\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n let T := mload(0x40)\\n mstore(add(T, 0x60), zz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n //Y:=mulmod(Y,zzz,p)//Y/zzz\\n //zz :=mulmod(zz, mload(T),p) //1/z\\n //zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, mload(T), p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return X;\\n }\\n\\n\\n /**\\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\\n * Returns affine representation of point (normalized) \\n * */\\n function ecZZ_mulmuladd(\\n uint256 Q0,\\n uint256 Q1, //affine rep for input point Q\\n uint256 scalar_u,\\n uint256 scalar_v\\n ) internal view returns (uint256 X, uint256 Y) {\\n uint256 zz;\\n uint256 zzz;\\n uint256 index = 255;\\n uint256[6] memory T;\\n uint256[2] memory H;\\n \\n unchecked {\\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\\n\\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\\n\\n assembly {\\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\\n index := sub(index, 1)\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n } {}\\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if eq(zz, 1) {\\n X := gx\\n Y := gy\\n }\\n if eq(zz, 2) {\\n X := Q0\\n Y := Q1\\n }\\n if eq(zz, 3) {\\n Y := mload(add(H,32))\\n X := mload(H)\\n }\\n\\n index := sub(index, 1)\\n zz := 1\\n zzz := 1\\n\\n for {} gt(minus_1, index) { index := sub(index, 1) } {\\n // inlined EcZZ_Dbl\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n {\\n //value of dibit\\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\\n\\n if iszero(T4) {\\n Y := sub(p, Y) //restore the -Y inversion\\n continue\\n } // if T4!=0\\n\\n if eq(T4, 1) {\\n T1 := gx\\n T2 := gy\\n }\\n if eq(T4, 2) {\\n T1 := Q0\\n T2 := Q1\\n }\\n if eq(T4, 3) {\\n T1 := mload(H)\\n T2 := mload(add(H,32))\\n }\\n if iszero(zz) {\\n X := T1\\n Y := T2\\n zz := 1\\n zzz := 1\\n continue\\n }\\n // inlined EcZZ_AddN\\n\\n //T3:=sub(p, Y)\\n //T3:=Y\\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\\n\\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\\n //todo : construct edge vector case\\n if iszero(y2) {\\n if iszero(T2) {\\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n T4 := mulmod(T2, T2, p) //PP\\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\\n zz := mulmod(zz, T4, p)\\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\\n let TT2 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\\n\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zzz)\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n Y:=mulmod(Y,mload(T),p)//Y/zzz\\n zz :=mulmod(zz, mload(T),p) //1/z\\n zz:= mulmod(zz,zz,p) //1/zz\\n X := mulmod(X, zz, p) //X/zz\\n } //end assembly\\n } //end unchecked\\n\\n return (X,Y);\\n }\\n\\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\\n //contract at given address dataPointer\\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\\n // the external tool to generate tables from public key is in the /sage directory\\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n unchecked {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n extcodecopy(dataPointer, T, mload(T), 64)\\n let index := sub(zz, 1)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for {} gt(index, 191) { index := add(index, 191) } {\\n //inline Double\\n {\\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(TT1, TT1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n let T1 := mulmod(TT1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n }\\n {\\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n let index2 := sub(index, 64)\\n let T3 :=\\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\\n let index3 := sub(index2, 64)\\n let T2 :=\\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\\n index := sub(index3, 64)\\n let T1 :=\\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T1) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n extcodecopy(dataPointer, T, T1, 64)\\n }\\n\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n\\n // inlined EcZZ_AddN\\n if iszero(zz) {\\n X := mload(T)\\n Y := mload(add(T, 32))\\n zz := 1\\n zzz := 1\\n\\n continue\\n }\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n\\n //special case ecAdd(P,P)=EcDbl\\n if iszero(y2) {\\n if iszero(T2) {\\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\\n T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n\\n T1 := mulmod(T1, T2, p) // W=UV\\n y2 := addmod(X, zz, p) //X+ZZ\\n let TT1 := addmod(X, sub(p, zz), p) //X-ZZ\\n y2 := mulmod(y2, TT1, p) //(X-ZZ)(X+ZZ)\\n let T4 := mulmod(3, y2, p) //M\\n\\n zzz := mulmod(TT1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\\n\\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\\n\\n continue\\n }\\n }\\n\\n let T4 := mulmod(T2, T2, p)\\n let T1 := mulmod(T4, T2, p) //\\n zz := mulmod(zz, T4, p)\\n //zzz3=V*ZZ1\\n zzz := mulmod(zzz, T1, p) // W=UV/\\n let zz1 := mulmod(X, T4, p)\\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n \\n\\n // improving the extcodecopy trick : append array at end of contract\\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\\n internal view\\n returns (uint256 X /*, uint Y*/ )\\n {\\n uint256 zz; // third and coordinates of the point\\n\\n uint256[6] memory T;\\n zz = 256; //start index\\n\\n unchecked {\\n while (T[0] == 0) {\\n zz = zz - 1;\\n //tbd case of msb octobit is null\\n T[0] = 64\\n * (\\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\\n );\\n }\\n assembly {\\n codecopy(T, add(mload(T), dataPointer), 64)\\n X := mload(T)\\n let Y := mload(add(T, 32))\\n let zzz := 1\\n zz := 1\\n\\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\\n let T2 := mulmod(T1, T1, p) // V=U^2\\n let T3 := mulmod(X, T2, p) // S = X1*V\\n T1 := mulmod(T1, T2, p) // W=UV\\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\\n\\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\\n\\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\\n\\n /* compute element to access in precomputed table */\\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\\n index := sub(index, 64)\\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\\n //index:=add(index,192), restore index, interleaved with loop\\n\\n //tbd: check validity of formulae with (0,1) to remove conditional jump\\n if iszero(T4) {\\n Y := sub(p, Y)\\n\\n continue\\n }\\n {\\n /* Access to precomputed table using extcodecopy hack */\\n codecopy(T, add(T4, dataPointer), 64)\\n\\n // inlined EcZZ_AddN\\n\\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\\n T4 := mulmod(T2, T2, p)\\n T1 := mulmod(T4, T2, p)\\n T2 := mulmod(zz, T4, p) // W=UV\\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\\n let zz1 := mulmod(X, T4, p)\\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\\n zz := T2\\n X := T4\\n }\\n } //end loop\\n mstore(add(T, 0x60), zz)\\n\\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\\n mstore(T, 0x20)\\n mstore(add(T, 0x20), 0x20)\\n mstore(add(T, 0x40), 0x20)\\n // Define variables base, exponent and modulus\\n //mstore(add(pointer, 0x60), u)\\n mstore(add(T, 0x80), minus_2)\\n mstore(add(T, 0xa0), p)\\n\\n // Call the precompiled contract 0x05 = ModExp\\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\\n\\n zz := mload(T)\\n X := mulmod(X, zz, p) //X/zz\\n }\\n } //end unchecked\\n }\\n\\n /**\\n * @dev ECDSA verification, given , signature, and public key.\\n */\\n function ecdsa_verify(bytes32 message, uint256[2] calldata rs, uint256[2] calldata Q) internal view returns (bool) {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n uint256 Q0 = Q[0];\\n uint256 Q1 = Q[1];\\n if (!ecAff_isOnCurve(Q0, Q1)) {\\n return false;\\n }\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 scalar_u = mulmod(uint256(message), sInv, n);\\n uint256 scalar_v = mulmod(r, sInv, n);\\n uint256 x1;\\n\\n x1 = ecZZ_mulmuladd_S_asm(Q0, Q1, scalar_u, scalar_v);\\n\\n assembly {\\n x1 := addmod(x1, sub(n, r), n)\\n }\\n //return true;\\n return x1 == 0;\\n }\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n /**\\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\\n * generation of contract bytecode for precomputations is done using sagemath code\\n * (see sage directory, WebAuthn_precompute.sage)\\n */\\n\\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\\n internal view\\n returns (bool)\\n {\\n uint256 r = rs[0];\\n uint256 s = rs[1];\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return false;\\n }\\n /* Q is pushed via bytecode assumed to be correct\\n if (!isOnCurve(Q[0], Q[1])) {\\n return false;\\n }*/\\n\\n uint256 sInv = FCL_nModInv(s);\\n uint256 X;\\n\\n //Shamir 8 dimensions\\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\\n\\n assembly {\\n X := addmod(X, sub(n, r), n)\\n }\\n return X == 0;\\n } //end ecdsa_precomputed_verify()\\n\\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) public view returns (address)\\n {\\n if (r == 0 || r >= n || s == 0 || s >= n) {\\n return address(0);\\n }\\n uint256 y=ec_Decompress(r, v-27);\\n uint256 rinv=FCL_nModInv(r);\\n uint256 u1=mulmod(n-addmod(0,h,n), rinv,n);//-hr^-1\\n uint256 u2=mulmod(s, rinv,n);//sr^-1\\n\\n uint256 Qx;\\n uint256 Qy;\\n (Qx,Qy)=ecZZ_mulmuladd(r,y, u1, u2);\\n\\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\\n }\\n\\n //ecdsa signature for test purpose only (who would like to have a private key onchain anyway ?)\\n //K is nonce, kpriv is private key\\n function ecdsa_sign(bytes32 message, uint256 k , uint256 kpriv) public view returns(uint256 r, uint256 s)\\n {\\n r=ecZZ_mulmuladd_S_asm(0,0, k, 0) ;//Calculate the curve point k.G (abuse ecmulmul add with v=0)\\n r=addmod(0,r, n); \\n s=mulmod(FCL_nModInv(k), addmod(uint256(message), mulmod(r, kpriv, n),n),n);//s=k^-1.(h+r.kpriv)\\n\\n \\n if(r==0||s==0){\\n revert();\\n }\\n\\n\\n }\\n\\n} //EOF\\n\",\"keccak256\":\"0xd6c3e555eae02916f6b9d65db6509d7ddf0fd76d5399e29dbc1502e0b7d992a6\",\"license\":\"MIT\"},\"FreshCryptoLib/utils/Base64Url.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Encode (without '=' padding) \\n * @author evmbrahmin, adapted from hiromin's Base64URL libraries\\n */\\nlibrary Base64Url {\\n /**\\n * @dev Base64Url Encoding Table\\n */\\n string internal constant ENCODING_TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\\\";\\n\\n function encode(bytes memory data) internal pure returns (string memory) {\\n if (data.length == 0) return \\\"\\\";\\n\\n // Load the table into memory\\n string memory table = ENCODING_TABLE;\\n\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n // @solidity memory-safe-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(12, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(\\n resultPtr,\\n mload(add(tablePtr, and(shr(6, input), 0x3F)))\\n )\\n resultPtr := add(resultPtr, 1)\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1)\\n }\\n\\n // Remove the padding adjustment logic\\n switch mod(mload(data), 3)\\n case 1 {\\n // Adjust for the last byte of data\\n resultPtr := sub(resultPtr, 2)\\n }\\n case 2 {\\n // Adjust for the last two bytes of data\\n resultPtr := sub(resultPtr, 1)\\n }\\n \\n // Set the correct length of the result string\\n mstore(result, sub(resultPtr, add(result, 32)))\\n }\\n\\n return result; \\n }\\n}\\n\",\"keccak256\":\"0xc9d5fbb0ef9ff0756eb5aabe7a32b2bf0f8f3c533d4451dd5778fe77aee7f0c1\",\"license\":\"Apache-2.0\"},\"contracts/FCL/WrapperFCLWebAuthn.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\nimport {FCL_WebAuthn} from \\\"FreshCryptoLib/FCL_Webauthn.sol\\\";\\n\\n/// @title WrapperFCLWebAuthn\\n/// @notice A library used to verify ECDSA signatures over secp256r1 through\\n/// EIP-1271 of Webauthn payloads.\\n/// @dev This lib is only a wrapper around the FCL_WebAuthn library.\\n/// It is meant to be used with 1271 signatures.\\n/// The wrapping is necessary because the FCL_WebAuthn has only internal\\n/// functions and use calldata. This makes it impossible to use it with\\n/// isValidSignature that use memory.\\nlibrary WrapperFCLWebAuthn {\\n function checkSignature(\\n bytes calldata authenticatorData,\\n bytes1 authenticatorDataFlagMask,\\n bytes calldata clientData,\\n bytes32 clientChallenge,\\n uint256 clientChallengeDataOffset,\\n uint256[2] calldata rs,\\n uint256[2] calldata Q\\n ) external view returns (bool) {\\n return FCL_WebAuthn.checkSignature(\\n authenticatorData,\\n authenticatorDataFlagMask,\\n clientData,\\n clientChallenge,\\n clientChallengeDataOffset,\\n rs,\\n Q\\n );\\n }\\n}\",\"keccak256\":\"0x21b11feafba10e0db2399a46a1d5d30a93c39d0f1c384f43ac43f4988b5d0586\"}},\"version\":1}", - "bytecode": "0x611a3c61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80630d5efec91461003a575b600080fd5b61004d61004836600461179d565b610061565b604051901515815260200160405180910390f35b60006100748a8a8a8a8a8a8a8a8a610082565b9a9950505050505050505050565b6000806100958b8b8b8b8b8b8b8b6100b4565b905060006100a4828686610357565b9c9b505050505050505050505050565b60007fff000000000000000000000000000000000000000000000000000000000000008716878a8a60208181106100ed576100ed61187c565b9050013560f81c60f81b167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610151576040517ffc93479200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061017d8560405160200161016991815260200190565b6040516020818303038152906040526104b9565b90506000815167ffffffffffffffff81111561019b5761019b6118ab565b6040519080825280601f01601f1916602001820160405280156101c5576020820181803683370190505b50905080518589016020830137600081516020830120905080836040516020016101ef91906118da565b604051602081830303815290604052805190602001201461023c576040517febab5d2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000915061024e9050896020611938565b67ffffffffffffffff811115610266576102666118ab565b6040519080825280601f01601f191660200182016040528015610290576020820181803683370190505b509050888a60208301376000600288886040516102ae92919061194b565b602060405180830381855afa1580156102cb573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906102ee919061195b565b90508060208b0183015260028260405161030891906118da565b602060405180830381855afa158015610325573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610348919061195b565b9b9a5050505050505050505050565b60008235602084013581158061038d57507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518210155b80610396575080155b806103c157507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518110155b156103d1576000925050506104b2565b833560208501356103e28282610628565b6103f35760009450505050506104b2565b60006103fe846107a1565b905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551828b09905060007fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325518388099050600061045e86868585610825565b90507fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551887fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255103820815985050505050505050505b9392505050565b606081516000036104d857505060408051602081019091526000815290565b60006040518060600160405280604081526020016119c760409139905060006003845160026105079190611938565b6105119190611974565b61051c9060046119af565b67ffffffffffffffff811115610534576105346118ab565b6040519080825280601f01601f19166020018201604052801561055e576020820181803683370190505b509050600182016020820185865187015b808210156105ca576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184535060018301925061056f565b50506003865106600181146105e657600281146105f1576105f8565b6002820391506105f8565b6001820391505b508290037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018252509392505050565b600082158061065657507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83145b8061065f575081155b8061068957507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82145b156106965750600061079b565b60007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409905060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc87097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09090890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff7f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b8208919091149150505b92915050565b600060405160208152602080820152602060408201528260608201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f60808201527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255160a082015260208160c0836005600019fa61081e57600080fd5b5192915050565b600080808060ff81808815801561083a575087155b1561084e57600096505050505050506112e6565b61089a7f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2967f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f58d8d6112ee565b8092508193505050600189841c16600189851c1660011b015b806108d55760018403935060018a851c1660018a861c1660011b0190506108b3565b50600189841c16600189851c1660011b01955060018603610937577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29696507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593505b60028603610946578a96508993505b60038603610955578196508093505b60018303925060019550600194505b827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111561123c577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff846002097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8182097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818a097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82840992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff807fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038e08096003097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff89850998507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a840999507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838409089a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08820992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff837fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a870908975060018d881c1660018d891c1660011b01905080610c4057877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03975050505050611231565b60018103610c8f577f6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29693507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592505b60028103610c9e578e93508d92505b60038103610cad578593508492505b89610cc657509198506001975087965094506112319050565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8609087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8c7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8d88090893508061102a578361102a577fffffffff00000001000000000000000000000000ffffffffffffffffffffffff897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd0994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff85860993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848d0992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84860994507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b8d0890507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d087fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81830991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8260030992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b82099a50507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8b85099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80847fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848509089b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808d7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038508830993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff808a8709850898505050505050611231565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84850991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8483097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838d099b507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818c099a507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff838e097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80827fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff847fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff878809080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80838d097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff03860809089a50505050809a50505050505b600183039250610964565b60405186606082015260208152602080820152602060408201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa6112b757600080fd5b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff815189099750505050505050505b949350505050565b600080808086611305578585935093505050611343565b84611317578787935093505050611343565b61132688886001808a8a61134c565b929a509098509250905061133c88888484611611565b9350935050505b94509492505050565b6000806000808860000361136b57508492508391506001905080611604565b7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff9889039889818988090894507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a7fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8a89090895507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86870993507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff86850992507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff84890991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff83880990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff848b0997507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80897fffffffff00000001000000000000000000000000fffffffffffffffffffffffd097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff857fffffffff00000001000000000000000000000000ffffffffffffffffffffffff037fffffffff00000001000000000000000000000000ffffffffffffffffffffffff898a09080893507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff80848b097fffffffff00000001000000000000000000000000ffffffffffffffffffffffff877fffffffff00000001000000000000000000000000ffffffffffffffffffffffff887fffffffff00000001000000000000000000000000ffffffffffffffffffffffff038d08090892505b9650965096509692505050565b600080600061161f846116c6565b90507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff818709915060007fffffffff00000001000000000000000000000000ffffffffffffffffffffffff82870990507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff81820991507fffffffff00000001000000000000000000000000ffffffffffffffffffffffff8289099350505094509492505050565b600060405160208152602080820152602060408201528260608201527fffffffff00000001000000000000000000000000fffffffffffffffffffffffd60808201527fffffffff00000001000000000000000000000000ffffffffffffffffffffffff60a082015260208160c0836005600019fa61081e57600080fd5b60008083601f84011261175557600080fd5b50813567ffffffffffffffff81111561176d57600080fd5b60208301915083602082850101111561178557600080fd5b9250929050565b806040810183101561079b57600080fd5b60008060008060008060008060006101208a8c0312156117bc57600080fd5b893567ffffffffffffffff808211156117d457600080fd5b6117e08d838e01611743565b909b50995060208c013591507fff000000000000000000000000000000000000000000000000000000000000008216821461181a57600080fd5b90975060408b0135908082111561183057600080fd5b5061183d8c828d01611743565b90975095505060608a0135935060808a0135925061185e8b60a08c0161178c565b915061186d8b60e08c0161178c565b90509295985092959850929598565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000825160005b818110156118fb57602081860181015185830152016118e1565b506000920191825250919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561079b5761079b611909565b8183823760009101908152919050565b60006020828403121561196d57600080fd5b5051919050565b6000826119aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761079b5761079b61190956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5fa2646970667358221220a5a42b5a5048bdf6322d6fa3052df01e1a197bbb61722775e8f972389e441d9964736f6c63430008140033", - "devdoc": { - "details": "This lib is only a wrapper around the FCL_WebAuthn library. It is meant to be used with 1271 signatures. The wrapping is necessary because the FCL_WebAuthn has only internal functions and use calldata. This makes it impossible to use it with isValidSignature that use memory.", - "kind": "dev", - "methods": {}, - "title": "WrapperFCLWebAuthn", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "A library used to verify ECDSA signatures over secp256r1 through EIP-1271 of Webauthn payloads.", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/hardhat.config.js b/hardhat.config.js index c92e6bf..2bf9f95 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -53,6 +53,18 @@ module.exports = { url: "https://muster-anytrust.alt.technology", accounts: [process.env.PRIVATE_KEY || ethers.ZeroHash], }, + muster: { + url: "https://muster.alt.technology/", + accounts: [process.env.PRIVATE_KEY || ethers.ZeroHash], + }, + muster_production: { + url: "https://muster.alt.technology/", + accounts: [process.env.PRIVATE_KEY || ethers.ZeroHash], + }, + muster_staging: { + url: "https://muster.alt.technology/", + accounts: [process.env.PRIVATE_KEY || ethers.ZeroHash], + }, mumbai: { url: "https://polygon-mumbai.infura.io/v3/" + process.env.INFURA_ID, accounts: [process.env.PRIVATE_KEY || ethers.ZeroHash], @@ -141,6 +153,13 @@ module.exports = { apiURL: "https://muster-anytrust-explorer.alt.technology/api", }, }, + { + network: "muster", + chainId: 4078, + urls: { + apiURL: "https://muster-explorer-v2.alt.technology/api", + }, + }, { network: "polygon_zkevm_testnet", chainId: 1442, diff --git a/package.json b/package.json index 31defb8..5b8ccfa 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "main": "index.js", "license": "MIT", "dependencies": { - "@cometh/contracts-factory": "^1.2.2", + "@cometh/contracts-factory": "^1.2.3", "@nomicfoundation/hardhat-verify": "^1.1.1", "@openzeppelin/contracts": "^4.8.2", "dotenv": "^16.3.1", diff --git a/yarn.lock b/yarn.lock index ac3aa75..23ea193 100644 --- a/yarn.lock +++ b/yarn.lock @@ -69,10 +69,10 @@ "@chainsafe/persistent-merkle-tree" "^0.4.2" case "^1.6.3" -"@cometh/contracts-factory@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@cometh/contracts-factory/-/contracts-factory-1.2.2.tgz#2aa01760db3787a2715a5ae6868213ce98e643fe" - integrity sha512-L+zR9trKalWgQGCvbk6jncaVwWEgZrYBCDfUnOWJjtUwGh6atvKXZhlaRHL99OLUjzme8tQypAvQGnH7TMWrdw== +"@cometh/contracts-factory@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@cometh/contracts-factory/-/contracts-factory-1.2.3.tgz#1afbc8c3e48e30deaebf1663e901795d66485722" + integrity sha512-PAKBiW8FZeKzCTfkAxUenz8nxb14sGXPhXMgvwOwrI3nMCi54MLQkAynTtHOEimdWZIN+mSpDjz5Ry4xIths2w== dependencies: dotenv "^16.3.1" ethers "^5.7.0"