编译器
0.8.20+commit.a1b79de6
文件 1 的 9:ERC1155Holder.sol
pragma solidity ^0.8.20;
import {IERC165, ERC165} from "../../../utils/introspection/ERC165.sol";
import {IERC1155Receiver} from "../IERC1155Receiver.sol";
abstract contract ERC1155Holder is ERC165, IERC1155Receiver {
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
}
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(
address,
address,
uint256[] memory,
uint256[] memory,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}
文件 2 的 9:ERC165.sol
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
文件 3 的 9:IERC1155Receiver.sol
pragma solidity ^0.8.20;
import {IERC165} from "../../utils/introspection/IERC165.sol";
interface IERC1155Receiver is IERC165 {
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}
文件 4 的 9:IERC165.sol
pragma solidity ^0.8.20;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 5 的 9:Interfaces.sol
pragma solidity 0.8.20;
interface IERC20 {
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function transfer(address to, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function balanceOf(address owner) external returns (uint256);
function totalSupply() external view returns (uint256);
}
interface IRealityETH_v3_0 {
function askQuestionWithMinBond(
uint256 template_id,
string memory question,
address arbitrator,
uint32 timeout,
uint32 opening_ts,
uint256 nonce,
uint256 min_bond
) external payable returns (bytes32);
function resultForOnceSettled(bytes32 question_id) external view returns (bytes32);
function getContentHash(bytes32 question_id) external view returns (bytes32);
function getTimeout(bytes32 question_id) external view returns (uint32);
function submitAnswer(bytes32 question_id, bytes32 answer, uint256 max_previous) external payable;
}
interface IConditionalTokens {
function payoutNumerators(bytes32 conditionId, uint256 index) external view returns (uint256);
function payoutDenominator(bytes32 conditionId) external view returns (uint256);
function prepareCondition(address oracle, bytes32 questionId, uint256 outcomeSlotCount) external;
function reportPayouts(bytes32 questionId, uint256[] calldata payouts) external;
function splitPosition(
address collateralToken,
bytes32 parentCollectionId,
bytes32 conditionId,
uint256[] calldata partition,
uint256 amount
) external;
function mergePositions(
address collateralToken,
bytes32 parentCollectionId,
bytes32 conditionId,
uint256[] calldata partition,
uint256 amount
) external;
function redeemPositions(
address collateralToken,
bytes32 parentCollectionId,
bytes32 conditionId,
uint256[] calldata indexSets
) external;
function getConditionId(
address oracle,
bytes32 questionId,
uint256 outcomeSlotCount
) external pure returns (bytes32);
function getCollectionId(
bytes32 parentCollectionId,
bytes32 conditionId,
uint256 indexSet
) external view returns (bytes32);
function getPositionId(address collateralToken, bytes32 collectionId) external pure returns (uint256);
function getOutcomeSlotCount(bytes32 conditionId) external view returns (uint256);
function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;
function balanceOf(address owner, uint256 id) external view returns (uint256);
}
interface IWrapped1155Factory {
function requireWrapped1155(
address multiToken,
uint256 tokenId,
bytes calldata data
) external returns (IERC20);
function unwrap(
address multiToken,
uint256 tokenId,
uint256 amount,
address recipient,
bytes calldata data
) external;
}
文件 6 的 9:MainnetRouter.sol
pragma solidity 0.8.20;
import "./Router.sol";
interface ISavingsDai is IERC20 {
function deposit(uint256 assets, address receiver) external returns (uint256 shares);
function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);
}
contract MainnetRouter is Router {
IERC20 public constant DAI = IERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F);
ISavingsDai public constant sDAI = ISavingsDai(0x83F20F44975D03b1b09e64809B757c47f942BEeA);
constructor(
IConditionalTokens _conditionalTokens,
IWrapped1155Factory _wrapped1155Factory
) Router(_conditionalTokens, _wrapped1155Factory) {}
function splitFromDai(Market market, uint256 amount) external {
DAI.transferFrom(msg.sender, address(this), amount);
DAI.approve(address(sDAI), amount);
uint256 shares = sDAI.deposit(amount, address(this));
_splitPosition(IERC20(address(sDAI)), market, shares);
}
function mergeToDai(Market market, uint256 amount) external {
_mergePositions(IERC20(address(sDAI)), market, amount);
sDAI.redeem(amount, msg.sender, address(this));
}
function redeemToDai(Market market, uint256[] calldata outcomeIndexes, uint256[] calldata amounts) external {
uint256 initialBalance = sDAI.balanceOf(address(this));
_redeemPositions(sDAI, market, outcomeIndexes, amounts);
uint256 finalBalance = sDAI.balanceOf(address(this));
if (finalBalance > initialBalance) {
sDAI.redeem(finalBalance - initialBalance, msg.sender, address(this));
}
}
}
文件 7 的 9:Market.sol
pragma solidity 0.8.20;
import {IERC20} from "./Interfaces.sol";
import "./RealityProxy.sol";
contract Market {
bool public initialized;
struct RealityParams {
bytes32[] questionsIds;
uint256 templateId;
string[] encodedQuestions;
}
struct ConditionalTokensParams {
bytes32 conditionId;
bytes32 parentCollectionId;
uint256 parentOutcome;
address parentMarket;
bytes32 questionId;
IERC20[] wrapped1155;
bytes[] data;
}
string public marketName;
string[] public outcomes;
uint256 public lowerBound;
uint256 public upperBound;
ConditionalTokensParams public conditionalTokensParams;
RealityParams public realityParams;
RealityProxy public realityProxy;
function initialize(
string memory _marketName,
string[] memory _outcomes,
uint256 _lowerBound,
uint256 _upperBound,
ConditionalTokensParams memory _conditionalTokensParams,
RealityParams memory _realityParams,
RealityProxy _realityProxy
) external {
require(!initialized, "Already initialized.");
marketName = _marketName;
outcomes = _outcomes;
lowerBound = _lowerBound;
upperBound = _upperBound;
conditionalTokensParams = _conditionalTokensParams;
realityParams = _realityParams;
realityProxy = _realityProxy;
initialized = true;
}
function templateId() external view returns (uint256) {
return realityParams.templateId;
}
function questionsIds() external view returns (bytes32[] memory) {
return realityParams.questionsIds;
}
function encodedQuestions(uint256 index) external view returns (string memory) {
return realityParams.encodedQuestions[index];
}
function questionId() external view returns (bytes32) {
return conditionalTokensParams.questionId;
}
function conditionId() external view returns (bytes32) {
return conditionalTokensParams.conditionId;
}
function parentCollectionId() external view returns (bytes32) {
return conditionalTokensParams.parentCollectionId;
}
function parentMarket() external view returns (address) {
return conditionalTokensParams.parentMarket;
}
function parentOutcome() external view returns (uint256) {
return conditionalTokensParams.parentOutcome;
}
function wrappedOutcome(uint256 index) external view returns (IERC20 wrapped1155, bytes memory data) {
return (conditionalTokensParams.wrapped1155[index], conditionalTokensParams.data[index]);
}
function parentWrappedOutcome() external view returns (IERC20 wrapped1155, bytes memory data) {
if (conditionalTokensParams.parentMarket != address(0)) {
(wrapped1155, data) =
Market(conditionalTokensParams.parentMarket).wrappedOutcome(conditionalTokensParams.parentOutcome);
}
}
function numOutcomes() external view returns (uint256) {
return outcomes.length;
}
function resolve() external {
realityProxy.resolve(this);
}
}
文件 8 的 9:RealityProxy.sol
pragma solidity 0.8.20;
import {IConditionalTokens, IRealityETH_v3_0} from "./Interfaces.sol";
import "./Market.sol";
contract RealityProxy {
IConditionalTokens public immutable conditionalTokens;
IRealityETH_v3_0 public immutable realitio;
bytes32 internal constant INVALID_RESULT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
uint256 internal constant REALITY_UINT_TEMPLATE = 1;
uint256 internal constant REALITY_SINGLE_SELECT_TEMPLATE = 2;
uint256 internal constant REALITY_MULTI_SELECT_TEMPLATE = 3;
constructor(IConditionalTokens _conditionalTokens, IRealityETH_v3_0 _realitio) {
conditionalTokens = _conditionalTokens;
realitio = _realitio;
}
function resolve(Market market) external {
bytes32[] memory questionsIds = market.questionsIds();
uint256 numOutcomes = market.numOutcomes();
uint256 templateId = market.templateId();
uint256 low = market.lowerBound();
uint256 high = market.upperBound();
bytes32 questionId = keccak256(abi.encode(questionsIds, numOutcomes, templateId, low, high));
if (templateId == REALITY_SINGLE_SELECT_TEMPLATE) {
resolveCategoricalMarket(questionId, questionsIds, numOutcomes);
return;
}
if (templateId == REALITY_MULTI_SELECT_TEMPLATE) {
resolveMultiCategoricalMarket(questionId, questionsIds, numOutcomes);
return;
}
if (questionsIds.length > 1) {
resolveMultiScalarMarket(questionId, questionsIds, numOutcomes);
return;
}
resolveScalarMarket(questionId, questionsIds, low, high);
}
function resolveCategoricalMarket(
bytes32 questionId,
bytes32[] memory questionsIds,
uint256 numOutcomes
) internal {
uint256 answer = uint256(realitio.resultForOnceSettled(questionsIds[0]));
uint256[] memory payouts = new uint256[](numOutcomes + 1);
if (answer == uint256(INVALID_RESULT) || answer >= numOutcomes) {
payouts[numOutcomes] = 1;
} else {
payouts[answer] = 1;
}
conditionalTokens.reportPayouts(questionId, payouts);
}
function resolveMultiCategoricalMarket(
bytes32 questionId,
bytes32[] memory questionsIds,
uint256 numOutcomes
) internal {
uint256 answer = uint256(realitio.resultForOnceSettled(questionsIds[0]));
uint256[] memory payouts = new uint256[](numOutcomes + 1);
if (answer == uint256(INVALID_RESULT)) {
payouts[numOutcomes] = 1;
} else {
bool allZeroes = true;
for (uint256 i = 0; i < numOutcomes; i++) {
payouts[i] = (answer >> i) & 1;
allZeroes = allZeroes && payouts[i] == 0;
}
if (allZeroes) {
payouts[numOutcomes] = 1;
}
}
conditionalTokens.reportPayouts(questionId, payouts);
}
function resolveScalarMarket(
bytes32 questionId,
bytes32[] memory questionsIds,
uint256 low,
uint256 high
) internal {
uint256 answer = uint256(realitio.resultForOnceSettled(questionsIds[0]));
uint256[] memory payouts = new uint256[](3);
if (answer == uint256(INVALID_RESULT)) {
payouts[2] = 1;
} else if (answer <= low) {
payouts[0] = 1;
} else if (answer >= high) {
payouts[1] = 1;
} else {
payouts[0] = high - answer;
payouts[1] = answer - low;
}
conditionalTokens.reportPayouts(questionId, payouts);
}
function resolveMultiScalarMarket(
bytes32 questionId,
bytes32[] memory questionsIds,
uint256 numOutcomes
) internal {
uint256[] memory payouts = new uint256[](numOutcomes + 1);
bool allZeroesOrInvalid = true;
uint256 maxPayout = 2 ** (256 / 2) - 1;
for (uint256 i = 0; i < numOutcomes; i++) {
payouts[i] = uint256(realitio.resultForOnceSettled(questionsIds[i]));
if (payouts[i] == uint256(INVALID_RESULT)) {
payouts[i] = 0;
} else if (payouts[i] > maxPayout) {
payouts[i] = maxPayout;
}
allZeroesOrInvalid = allZeroesOrInvalid && payouts[i] == 0;
}
if (allZeroesOrInvalid) {
payouts[numOutcomes] = 1;
}
conditionalTokens.reportPayouts(questionId, payouts);
}
}
文件 9 的 9:Router.sol
pragma solidity 0.8.20;
import {IConditionalTokens, IERC20, IWrapped1155Factory} from "./Interfaces.sol";
import "./Market.sol";
import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
contract Router is ERC1155Holder {
IConditionalTokens public immutable conditionalTokens;
IWrapped1155Factory public immutable wrapped1155Factory;
constructor(IConditionalTokens _conditionalTokens, IWrapped1155Factory _wrapped1155Factory) {
conditionalTokens = _conditionalTokens;
wrapped1155Factory = _wrapped1155Factory;
}
function splitPosition(IERC20 collateralToken, Market market, uint256 amount) public {
if (market.parentCollectionId() == bytes32(0)) {
collateralToken.transferFrom(msg.sender, address(this), amount);
}
_splitPosition(collateralToken, market, amount);
}
function _splitPosition(IERC20 collateralToken, Market market, uint256 amount) internal {
bytes32 parentCollectionId = market.parentCollectionId();
bytes32 conditionId = market.conditionId();
uint256[] memory partition = getPartition(conditionalTokens.getOutcomeSlotCount(conditionId));
if (parentCollectionId != bytes32(0)) {
(IERC20 wrapped1155, bytes memory data) = market.parentWrappedOutcome();
uint256 tokenId = conditionalTokens.getPositionId(address(collateralToken), parentCollectionId);
wrapped1155.transferFrom(msg.sender, address(this), amount);
wrapped1155Factory.unwrap(address(conditionalTokens), tokenId, amount, address(this), data);
} else {
collateralToken.approve(address(conditionalTokens), amount);
}
conditionalTokens.splitPosition(address(collateralToken), parentCollectionId, conditionId, partition, amount);
for (uint256 j = 0; j < partition.length; j++) {
uint256 tokenId = getTokenId(collateralToken, parentCollectionId, conditionId, partition[j]);
(IERC20 wrapped1155, bytes memory data) = market.wrappedOutcome(j);
conditionalTokens.safeTransferFrom(address(this), address(wrapped1155Factory), tokenId, amount, data);
require(wrapped1155.transfer(msg.sender, amount), "Wrapped token transfer failed");
}
}
function mergePositions(IERC20 collateralToken, Market market, uint256 amount) public {
_mergePositions(collateralToken, market, amount);
if (market.parentCollectionId() == bytes32(0)) {
require(collateralToken.transfer(msg.sender, amount), "Collateral transfer failed");
}
}
function _mergePositions(IERC20 collateralToken, Market market, uint256 amount) internal {
bytes32 parentCollectionId = market.parentCollectionId();
bytes32 conditionId = market.conditionId();
uint256[] memory partition = getPartition(conditionalTokens.getOutcomeSlotCount(conditionId));
for (uint256 j = 0; j < partition.length; j++) {
uint256 tokenId = getTokenId(collateralToken, parentCollectionId, conditionId, partition[j]);
(IERC20 wrapped1155, bytes memory data) = market.wrappedOutcome(j);
wrapped1155.transferFrom(msg.sender, address(this), amount);
wrapped1155Factory.unwrap(address(conditionalTokens), tokenId, amount, address(this), data);
}
conditionalTokens.mergePositions(address(collateralToken), parentCollectionId, conditionId, partition, amount);
if (parentCollectionId != bytes32(0)) {
uint256 tokenId = conditionalTokens.getPositionId(address(collateralToken), parentCollectionId);
(IERC20 wrapped1155, bytes memory data) = market.parentWrappedOutcome();
conditionalTokens.safeTransferFrom(address(this), address(wrapped1155Factory), tokenId, amount, data);
require(wrapped1155.transfer(msg.sender, amount), "Wrapped token transfer failed");
}
}
function redeemPositions(
IERC20 collateralToken,
Market market,
uint256[] calldata outcomeIndexes,
uint256[] calldata amounts
) public {
bytes32 parentCollectionId = market.parentCollectionId();
uint256 initialBalance;
if (parentCollectionId == bytes32(0)) {
initialBalance = collateralToken.balanceOf(address(this));
}
_redeemPositions(collateralToken, market, outcomeIndexes, amounts);
if (parentCollectionId == bytes32(0)) {
uint256 finalBalance = collateralToken.balanceOf(address(this));
if (finalBalance > initialBalance) {
require(collateralToken.transfer(msg.sender, finalBalance - initialBalance), "Collateral transfer failed");
}
}
}
function _redeemPositions(
IERC20 collateralToken,
Market market,
uint256[] calldata outcomeIndexes,
uint256[] calldata amounts
) internal {
bytes32 parentCollectionId = market.parentCollectionId();
bytes32 conditionId = market.conditionId();
uint256 tokenId = 0;
uint256[] memory indexSets = new uint256[](outcomeIndexes.length);
for (uint256 j = 0; j < outcomeIndexes.length; j++) {
indexSets[j] = 1 << outcomeIndexes[j];
tokenId = getTokenId(collateralToken, parentCollectionId, conditionId, indexSets[j]);
(IERC20 wrapped1155, bytes memory data) = market.wrappedOutcome(outcomeIndexes[j]);
wrapped1155.transferFrom(msg.sender, address(this), amounts[j]);
wrapped1155Factory.unwrap(address(conditionalTokens), tokenId, amounts[j], address(this), data);
}
uint256 initialBalance = 0;
if (parentCollectionId != bytes32(0)) {
tokenId = conditionalTokens.getPositionId(address(collateralToken), parentCollectionId);
initialBalance = conditionalTokens.balanceOf(address(this), tokenId);
}
conditionalTokens.redeemPositions(address(collateralToken), parentCollectionId, conditionId, indexSets);
if (parentCollectionId != bytes32(0)) {
uint256 finalBalance = conditionalTokens.balanceOf(address(this), tokenId);
if (finalBalance > initialBalance) {
(IERC20 parentWrapped1155, bytes memory parentData) = market.parentWrappedOutcome();
conditionalTokens.safeTransferFrom(
address(this), address(wrapped1155Factory), tokenId, finalBalance - initialBalance, parentData
);
require(parentWrapped1155.transfer(msg.sender, finalBalance - initialBalance), "Parent wrapped token transfer failed");
}
}
}
function getPartition(uint256 size) internal pure returns (uint256[] memory) {
uint256[] memory partition = new uint256[](size);
for (uint256 i = 0; i < size; i++) {
partition[i] = 1 << i;
}
return partition;
}
function getTokenId(
IERC20 collateralToken,
bytes32 parentCollectionId,
bytes32 conditionId,
uint256 indexSet
) public view returns (uint256) {
bytes32 collectionId = conditionalTokens.getCollectionId(parentCollectionId, conditionId, indexSet);
return conditionalTokens.getPositionId(address(collateralToken), collectionId);
}
function getWinningOutcomes(bytes32 conditionId) external view returns (bool[] memory) {
bool[] memory result = new bool[](conditionalTokens.getOutcomeSlotCount(conditionId));
for (uint256 i = 0; i < result.length; i++) {
result[i] = conditionalTokens.payoutNumerators(conditionId, i) == 0 ? false : true;
}
return result;
}
}
{
"compilationTarget": {
"src/MainnetRouter.sol": "MainnetRouter"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 100
},
"remappings": []
}
[{"inputs":[{"internalType":"contract IConditionalTokens","name":"_conditionalTokens","type":"address"},{"internalType":"contract IWrapped1155Factory","name":"_wrapped1155Factory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DAI","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"conditionalTokens","outputs":[{"internalType":"contract IConditionalTokens","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"collateralToken","type":"address"},{"internalType":"bytes32","name":"parentCollectionId","type":"bytes32"},{"internalType":"bytes32","name":"conditionId","type":"bytes32"},{"internalType":"uint256","name":"indexSet","type":"uint256"}],"name":"getTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"conditionId","type":"bytes32"}],"name":"getWinningOutcomes","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"collateralToken","type":"address"},{"internalType":"contract Market","name":"market","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mergePositions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Market","name":"market","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mergeToDai","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"collateralToken","type":"address"},{"internalType":"contract Market","name":"market","type":"address"},{"internalType":"uint256[]","name":"outcomeIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"redeemPositions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Market","name":"market","type":"address"},{"internalType":"uint256[]","name":"outcomeIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"redeemToDai","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sDAI","outputs":[{"internalType":"contract ISavingsDai","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract Market","name":"market","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"splitFromDai","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"collateralToken","type":"address"},{"internalType":"contract Market","name":"market","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"splitPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrapped1155Factory","outputs":[{"internalType":"contract IWrapped1155Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"}]